segfault访问其他类型后访问数组时



所以我知道你可以做这样的事情:

 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));

最新更新