为什么&运算符为结构类型赋予不同的值

时间:2012-12-10 07:10:51

标签: c memory-address

考虑以下测试程序(codepad execution):

#include <stdio.h>
#include <string.h>


struct camp {
    char b[8];
};


int main()
{
    struct camp c;
    strcpy(c.b, "Hello");
    c.b[5] = '\0';
    printf("c size: %d\nAddress (amp): %d :: %d\n", sizeof(c), &c, c);
    printf("Address of b: %d :: %d\n", &(c.b), c.b);

    return 0;
}

示例输出:

c size: 8
Address (amp): -1082463628 :: 1819043144
Address of b: -1082463628 :: -1082463628

尽管&(c.b)c.b(第二次调用printf)给出的地址相同,但struct camp c(第一次调用printf)的地址返回不同的地址。此外,&c&(c.b)c.b相同。

到底发生了什么?

2 个答案:

答案 0 :(得分:5)

{1}}在第一种情况下尝试做的是将printf解释为整数。 c 不是一个整数,甚至是一个可以转换为整数(显式或隐式)的值,因此在调用未定义的行为时,写入的值可以是任何值。

答案 1 :(得分:1)

结构中只有一个数据成员,因此您看到b以及结构对象c的地址相同。

此外,数组名称给出了该数组的第一个元素的地址。因此,c.b将提供与&(c.b)相同的地址,因为后者是整个数组的地址。

&c &(c.b)c.b在您的情况下是相同的,但您使用c格式说明符打印%d,因此您看到{ {1}},最后一个参数不是undefined behaviour的地址(所以你得到了垃圾值)。

相关问题