0

在 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

4 回答 4

2

像这样:

*((int*) memp) = 250;

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

于 2009-05-10T11:38:01.050 回答
2

您是否考虑过使用联合,例如:

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

那你就不用担心选角了。(当然,您仍然需要担心字节顺序,但这是另一个问题。)

于 2009-05-10T11:45:57.613 回答
1

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

一种可移植的方式可能是:

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

不过,使用联合可能会使这更容易,所以 +1 给 JamieH。

于 2009-05-10T12:02:36.323 回答
0

将指针投射到int,而不是unsigned char再次!

int * memp = (int *)mem;
* memp = 250; //An example of size I want to assign.
于 2009-05-10T11:39:38.097 回答