【问题标题】:Writing an int to a char array将 int 写入 char 数组
【发布时间】:2011-05-25 22:42:39
【问题描述】:

我正在用 C 编写一个模拟器。它的内存是字节可寻址的,所以我使用的是 char 数组,但我需要读/写未对齐的 32 位整数。

目前我正在使用*((unsigned int*) &memory[address]),但它看起来很可怕。最好的方法是什么?

【问题讨论】:

  • 请注意,在某些机器体系结构上,像这样的未对齐的 32 位写入根本不起作用——而不是性能不佳,您会崩溃。因此,根据您的目标平台,您可能需要一次写入一个字节。
  • 另请注意,对于某些编译器,int 并不完全是 32 位,所以如果您真的是指“四个字节”而不是“sizeof(int)”,并且您关心可移植性和可维护性,你需要做一些不同的事情。
  • 在 Kristopher 的观点上再添加一件事。如果您希望您的模拟器可移植到小端和大端平台,正确的答案可能比 memcpy() 或其他可以处理未对齐地址的字节方式副本更复杂一些。我不知道这对你来说是否重要,但如果它是你需要考虑的事情。
  • 我知道字节序,但我认为在这种情况下它并不重要。模拟器只会在特定环境下运行。

标签: c arrays pointers


【解决方案1】:

您可以直接使用memcpy()。例如:

unsigned int x = 10;
unsigned char* memory = malloc(sizeof(unsigned char) * 512);
address = sizeof(unsigned char) * 256;

memcpy(memory + address, &x, sizeof(unsigned int)); 

【讨论】:

  • memcpy() 在可移植性方面可能是最安全的方法,但是如果您的编译器实际上每次都进行函数调用,您可能对性能不满意。 (但请注意,许多编译器会内联 memcpy 或将其替换为机器指令。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-09
  • 2017-02-19
相关资源
最近更新 更多