在c中打印指针中的指针差异

use*_*929 0 c pointers casting

考虑一下代码:

int main() {
    char orange[5];
    for (int i = 0; i < 5; i++)
        orange[i] = 1;
    printf("orange: %d\n", *((char *)orange));        
    printf("orange: %d\n", *((int *)orange)); 
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一个print语句给了我一个值1,但是第二个print语句给了我一个值16843009.差异的原因是什么?

M.M*_*M.M 5

在第二个中,您将一些相邻值别名charint.根据C标准,这是不确定的; 但是,通常的结果是,您将获得其值与连接的值的int位模式具有相同的位模式char.

在这种情况下,您看到的值是十进制形式0x01010101.

正是由于C99 6.5#7,它列出了有效的类型组合可能是别名未定义行为,char因为int没有在列表中.(你可以别名intchar,而不是周围的其他方式).请参阅此处以获取标准文本.

由于对齐要求,还存在潜在的未定义行为.例如,某些系统要求int只能在4的倍数的地址访问.