Pointers 理解指针的划分';s按sizeof计算的数学值(长) 用foo1替换fooX将打印“零” 用foo2替换fooX将打印“零” 用foo3替换fooX打印“非零”

Pointers 理解指针的划分';s按sizeof计算的数学值(长) 用foo1替换fooX将打印“零” 用foo2替换fooX将打印“零” 用foo3替换fooX打印“非零”,pointers,sizeof,Pointers,Sizeof,我理解代码,但我不明白为什么每个foo的值都为零或非零,也不知道何时会为零或不为零(因为还有其他方法/关键字来声明变量)。你能给我解释一下吗 此代码部分取自about memcpy()您正在使用地址和值进行算术运算。这里得到的只是变量的位置是否与内存中的long对齐。静态值明显未对齐。顺便说一句,在C中,这是一个编译器错误。@BartFriederichs感谢您指出内存对齐。现在我感觉好多了。但是这段代码(带有适当的include和main声明)在我的系统上编译(OSX上的clang),使用-W

我理解代码,但我不明白为什么每个foo的值都为零或非零,也不知道何时会为零或不为零(因为还有其他方法/关键字来声明变量)。你能给我解释一下吗


此代码部分取自about memcpy()

您正在使用地址和值进行算术运算。这里得到的只是变量的位置是否与内存中的long对齐。
静态
值明显未对齐。顺便说一句,在C中,这是一个编译器错误。@BartFriederichs感谢您指出内存对齐。现在我感觉好多了。但是这段代码(带有适当的include和main声明)在我的系统上编译(OSX上的clang),使用
-Wall-Wextra-Werror
。你有什么错误?
char        *foo1 = (char*)malloc(8 * sizeof(foo1));
char        foo2[8];
static char foo3[8];

if ((uintptr_t)fooX % sizeof(long) == 0)
    printf("Zero\n");
else
    printf("Non-zero\n");