在类型转换为不同类型后访问数组时出现段错误

时间:2017-09-25 07:15:26

标签: c

所以我知道你可以这样做:

 char c[4];
 int *p;

 p = (int*)c;
 p[0] = 1;

一次设置所有字符值。但我更进一步,做了:

char c[1][4];
int **p;

p = (int**)c;
p[0][0] = 1;

并且它是段错误的。有人可以解释为什么会这样吗?

1 个答案:

答案 0 :(得分:4)

你在第一个例子中很幸运:对某些CPU的对齐约束(例如:在传统的68000上)可能会立即进行分段...更不用说因为字节序问题而不是可移植代码。

那就是说,c[1][4]不是一个指针数组。它是一个2D阵列(4字节存储)。因此,像你一样去取消它的两次肯定会失败(你以前的技术可能会#34;但是工作"但是)。

像这样对编译器说谎并不是一个真正的选择。另请注意,int不能保证长度为4个字节,因此最好使用标准化类型,如uint32_t(来自stdint.h的无符号32位整数)

要更快地设置数据,您可以使用memcpy,例如:

uint32 v = 1;
memcpy(c,&v,sizeof(v));