什么*首先在此代码中打印?

时间:2017-09-29 06:17:08

标签: c pointers

请告诉*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

    }

输出:

enter image description here

2 个答案:

答案 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打印的地址}。