c结构问题

时间:2011-03-09 02:33:26

标签: c arrays pointers struct

#include <stdio.h>
struct audiocd {
    char title[256];
    int trackNo;
    char type;
    char publisher[256];
};
int main() {
    struct audiocd* cdptr;
    struct audiocd cdarray[4];
    cdptr = cdarray;

    printf("%d\n", &(cdarray[2]));
    printf("%d\n", cdptr);
}

什么是cdarray[2] & cdptr

编辑:谢谢,但如果printf("%d\n", &cdarray)4291520,是否可以追踪printf("%d\n", &(cdarray[2])) & printf("%d\n", cdptr)

3 个答案:

答案 0 :(得分:4)

程序的整体效果只是未定义的行为。它将地址传递给printf,但使用%d转换,它需要一个int。不匹配会导致不确定的行为。

在典型情况下,int和指针的大小相同,它会打印出cdptr中的地址和cdarray[2]的地址。

如果你想打印出这些地址,显而易见的方法是:

printf("%p", (void *)&cdarray[2]); // (void *)cdarray+2
printf("%p", (void *)cdptr);

至于那些表达式“是”,它们分别是地址 - 数组开头的地址和数组的第三个元素。

答案 1 :(得分:0)

这是你应该如何打印(%u而不是%d来打印指针的地址)

#include <stdio.h>
struct audiocd {
   char title[256];
   int trackNo;
   char type;
   char publisher[256];
};
int main() {
   struct audiocd* cdptr;
   struct audiocd cdarray[4];
   cdptr = cdarray;

   printf("%u\n", (cdarray[2]));
   printf("%u\n", cdptr);
}

顺便说一句,你的代码只是打印结构audiocd数组的第1和第3个元素的内存地址。

答案 2 :(得分:0)

  

谢谢,但如果是printf(“%d \ n”,   &amp; cdarray)是4291520,是否有可能   跟踪printf(“%d \ n”,&amp;(cdarray [2]))   &安培; printf(“%d \ n”,cdptr)。

如果我的问题正确,我想你想从cdarray的值推断&amp;(cdarray [2])和&amp;(cdptr)的值。

当您将cdarray分配给cdptr时,cdptr将存储该数组的起始地址。现在&amp;(cdarray [2])只是

cdarray + 2*sizeof(struct audiocd)

另外,如上所述,%p应该用于打印内存地址而不是%d。

相关问题