请告诉*first
在这里打印
struct Node{
int info;
struct Node *next;
};
void main()
{
struct Node* first=NULL;
struct Node* second=NULL;
struct Node* third=NULL;
first=(struct Node*) malloc(sizeof(struct Node));
second=(struct Node*) malloc(sizeof(struct Node));
third=(struct Node*) malloc(sizeof(struct Node));
first->info=1;
first->next=second;
printf("*first %d ->\n ",*first); //6487584 ?? what is *first is here should it be same as first->info?
printf("first %d ->\n",first); //13439936
printf("&first %d ->\n",&first); //6487608
printf("&first->info %d ->\n",&first->info); //13439936
printf("&first->next %d ->\n",&first->next); //13439944
}
输出:
答案 0 :(得分:3)
所有这些
printf("*first %d ->\n ",*first);
printf("first %d ->\n",first);
printf("&first %d ->\n",&first);
printf("&first->info %d ->\n",&first->info);
printf("&first->next %d ->\n",&first->next);
由于格式说明符%d
(需要int
参数)与提供给printf
的实际参数的类型不匹配,产生未定义的行为。
他们不打印任何有意义的东西。
虽然可以使用正确的格式说明符和/或强制转换来挽救打印指针值的尝试,但打印*first
无法挽救。 *first
的值为struct Node
类型。 printf
中没有合适的格式说明符以任何有意义的方式处理此类值。
答案 1 :(得分:1)
您的计划会调用undefined behaviour。如果要打印对象的地址(&
运算符给出对象的地址),请将地址转换为(void *)
并使用%p
中的printf
说明符像这样:
printf("&first->info -> %p\n",(void *) &first->info);
如果你打算打印info
本身,这应该足够了:
printf("first->info -> %d\n", first->info);
使用*first
说明符打印%d
时,您将取消引用first
中包含的地址,并说出恰好是int
打印的地址}。