Int在uchar的模拟内存数组中

时间:2009-05-10 11:35:26

标签: c casting malloc

在C中,在Unix环境(Plan9)中,我有一个数组作为内存。

uchar mem[32*1024];

我需要该数组包含不同的字段,例如int(整数),以指示内存大小和可用内存。所以,我试过这个:

uchar* memp=mem;
*memp=(int)250; //An example of size I want to assign.

我知道int的大小是4,所以我必须强制使用强制转换或类似的东西,mem的四个第一个插槽的内容在这种情况下的数字是250,它是大端。

但问题是,当我尝试按照我所解释的那样做它不起作用时。我认为类型的转换存在错误。我希望你问,我怎么能强制mem [0]到mem [3]会有大小指示,表示为int而不是uchar?

提前致谢

4 个答案:

答案 0 :(得分:2)

像这样:

*((int*) memp) = 250;

那说“即使memp是指向字符的指针,我希望你把它当作一个指向整数的指针,并将这个整数放在它指向的位置。”

答案 1 :(得分:2)

您是否考虑过使用工会,如:

union mem_with_size {
  int   size;
  uchar mem[32*1024];
};

然后你不必担心施法。 (当然,您仍然需要担心字节排序,但这是一个不同的问题。)

答案 2 :(得分:1)

正如其他人指出的那样,你需要转换为指向int的指针。您还需要确保考虑对齐指针:在许多体系结构中,int需要从可被sizeof(int)整除的内存位置开始,如果您尝试访问未对齐的int,则会得到一个SIGBUS。在其他架构上,它可以工作,但速度很慢。还有一些,它很快就会起作用。

这样做的便携方式可能是:

int x = 250;
memcpy(mem + offset, &x, sizeof(x));

使用工会可能会让这更容易,所以+1给JamieH。

答案 3 :(得分:0)

将指针转换为int,而不是再次unsigned char

int * memp = (int *)mem;
* memp = 250; //An example of size I want to assign.