所以我知道你可以做这样的事情:
char c[4];
int *p;
p = (int*)c;
p[0] = 1;
一次设置所有字符值。但是我走了一步,做到了:
char c[1][4];
int **p;
p = (int**)c;
p[0][0] = 1;
和它segfaults。有人可以解释为什么会发生这种情况吗?
您在第一个示例中很幸运:某些CPU上的对齐约束(ex:on Legacy 68000)可能会立即遇到……更不用说由于Endianness问题而不是便携式代码了。
也就是说,c[1][4]
不是一系列指针。这是一个2D数组(4个字节存储)。因此,请像您所做的那样将其删除两次(尽管您以前的技术可能"有效")。
这样的编译器躺在编译器上并不是真正的选择。另请注意,int
不能保证为4个字节,因此更好地使用标准化类型(例如uint32_t
)(stdint.h
的无签名32位整数)
要更快地设置数据,您可以使用memcpy
,示例:
uint32 v = 1;
memcpy(c,&v,sizeof(v));