为什么(int)((int *)0 + 4)== 16?

时间:2017-03-08 03:59:34

标签: c

我测试了这个,k是16,但为什么?

int main(int argc, char **argv) {
    int k = (int)((int *)0 + 4);
    printf("%d", k);

    return 0;
}

2 个答案:

答案 0 :(得分:3)

重要提示:指向不指向数组的指针的指针算法是未定义的行为。你可以得到16,但是如果实现选择为结果生成陷阱表示,你也可能会崩溃。

这是指针算术:当您向指向x的指针添加数字T时,与指针对应的数值增加x * sizeof(T)

在您的情况下,指针的数值为零,x为4,sizeof(int)也为4. 4*4产生16。

答案 1 :(得分:1)

C中的指针运算使用类型的大小作为单位;将int加1将使其前进4(假设int为32位)。

编辑:对无效指针(包括NULL)的指针算法是未定义的行为。