【发布时间】:2015-03-11 04:50:20
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
struct s1 {
char *z;
int i;
struct s1 *p;
};
struct s1 *ptr;
static struct s1 a[] = {
{"Nagpur", 1, a + 1},
{"Raipur", 2, a + 2},
{"Kanpur", 3, a}
};
ptr = a;
printf("%p\n", a[0]);
printf("%p\n", a[1]);
printf("%p\n", a[2]);
printf("%p\n", ptr);
printf("%p\n", a[2].p);
printf("%p\n", a[1].p->p);
printf("%p\n", a);
return EXIT_SUCCESS;
}
只要我们有一个数组,假设我们称它为a[10],那么a 或a[0] 的地址是相等的。但在上述情况下,a 的地址和a[0] 的地址是不同的。我不知道为什么?
【问题讨论】:
-
你不认为你的程序(和编译器)的输出会有帮助吗?
-
我检查了输出,但我仍然无法弄清楚为什么它会给出这样的输出。你不认为如果我打印出
ptr它应该给出与a[0]相同的结果吗? -
总是在打印数据指针之前添加cast to
void *。printf("%p\n", (void *)&a[0]);。也可以使用-W -Wall -O2编译以获得您的答案。 -
好吧,我强烈建议不要使用任何优化,所以不要使用“-O2”,但是我真的很想看看这个程序的输出。该输出将对调试过程有很大帮助。
-
带有 a[x] 参数的 printf() 调用不会打印地址,而是该偏移量的内容。这条线段:'那么a或a[0]的地址相等'是不正确的。但是,那么a的地址和a[0]的地址相等是真的。