0

考虑以下测试程序(键盘执行):

#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)返回不同的地址。此外,与or&c相同。&(c.b)c.b

到底发生了什么?

4

2 回答 2

5

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

于 2012-12-10T07:15:05.103 回答
1

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

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

&c &(c.b)并且c.b在您的情况下将是相同的,但是您正在打印cusing%d格式说明符,因此您看到的是undefined behaviour, 最后一个参数不是的地址c(因此您得到的是垃圾值)。

于 2012-12-10T07:15:46.150 回答