所以我知道你可以这样做:
char c[4];
int *p;
p = (int*)c;
p[0] = 1;
一次设置所有字符值。但我更进一步,做了:
char c[1][4];
int **p;
p = (int**)c;
p[0][0] = 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));