uchar模拟内存阵列中的Int

uchar模拟内存阵列中的Int,c,casting,malloc,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,所以我必须强制使用casting或类似的方法,mem的前四个槽的内容是250,在这种情况下,它是big-endian 但问题是,

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

uchar mem[32*1024];
我需要这个数组包含不同的字段,比如一个int(整数)来表示可用内存的大小。所以,我试过这个:

uchar* memp=mem;
*memp=(int)250; //An example of size I want to assign.
我知道int的大小是4,所以我必须强制使用casting或类似的方法,mem的前四个槽的内容是250,在这种情况下,它是big-endian

但问题是,当我试图做我解释过的事情时,它不起作用。我想在类型转换方面有一个错误。我希望能问你,我怎样才能强迫mem[0]到mem[3]显示大小,用int表示,用uchar表示no

提前感谢

像这样:

*((int*) memp) = 250;
这表示“即使
memp
是一个指向字符的指针,我希望您将其视为指向整数的指针,并将该整数放在它所指向的位置。”

如下所示:

*((int*) memp) = 250;

也就是说,“即使
memp
是一个指向字符的指针,我希望您将它视为指向整数的指针,并将这个整数放在它所指向的位置。”

再次将指针转换为
int
,而不是
无符号字符

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

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

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

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

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

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

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

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

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

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

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

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

不过,使用并集可能会使这更容易,所以+1到JamieH。

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

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

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

不过,使用并集可能会使这更容易,所以将+1指定给JamieH。

但是,如果我想将指针指定给mem的另一部分(无符号字符数组),则在开始时将指针指定为nil。我可以这样做吗?:((void)memp)=nil;它不能编译(在尝试将char/uchar以外的内容写入uchar数组时要小心,除非您知道地址已正确对齐(即,对于32位系统,通常与4字节边界对齐)。许多现代处理器可以处理未对齐的写入(有性能损失——请注意,编译器可能会假设最坏的情况,并使用较慢的指令进行写入),但有些仍然不能——例如,早期ARMs等较小的处理器。您可能还需要担心别名问题……但是,如果我想将指针分配给mem的另一部分(无符号字符数组)我可以这样做吗?:((void)memp)=nil;它不可编译。:(尝试将char/uchar以外的内容写入uchar数组时要小心,除非您知道地址已正确对齐(即,对于32位系统,通常与4字节边界对齐)。许多现代处理器可以处理未对齐的写操作(性能会受到影响——请注意,编译器可能会假设最差的情况,并使用较慢的指令进行写操作),但有些处理器仍然无法处理,例如,早期ARMs等较小的处理器。您可能还需要担心别名问题。。。