Struct 尝试在C中打印结构值时获得奇怪的O/P #包括 #包括 #包括 结构信息 { int-id; 字符名[20]; }; int main() { 结构信息; 结构信息*ptr; ptr=&p; (*ptr).id=20; strcpy((*ptr).name,“Delluh”); printf(“\n%u%u%u\n\n”,*ptr,ptr->id,ptr->name); 返回0; }

Struct 尝试在C中打印结构值时获得奇怪的O/P #包括 #包括 #包括 结构信息 { int-id; 字符名[20]; }; int main() { 结构信息; 结构信息*ptr; ptr=&p; (*ptr).id=20; strcpy((*ptr).name,“Delluh”); printf(“\n%u%u%u\n\n”,*ptr,ptr->id,ptr->name); 返回0; },struct,printf,Struct,Printf,最后一个printf语句给了我一个输出'20 1819043140 26741',其中20是正确的值,其余2个值是一些垃圾值。然而,从ptr中删除*后,我得到了一个地址值的正确输出,20,然后是另一个地址值。有人能告诉我为什么把*放在ptr前面会导致其他两个值弄乱吗?如果你使用这个,就不会更正确了 #include<stdio.h> #include<stdlib.h> #include<string.h> struct info { int

最后一个printf语句给了我一个输出'20 1819043140 26741',其中20是正确的值,其余2个值是一些垃圾值。然而,从ptr中删除*后,我得到了一个地址值的正确输出,20,然后是另一个地址值。有人能告诉我为什么把*放在ptr前面会导致其他两个值弄乱吗?

如果你使用这个,就不会更正确了

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct info
{
        int id;
        char name[20];
};

int main()
{
        struct info p;
        struct info *ptr;

        ptr = &p;


        (*ptr).id = 20;
        strcpy((*ptr).name, "Delluh");


        printf("\n %u %u %u\n\n",*ptr,ptr->id,ptr->name);



        return 0;

}
您在printf中对所有参数使用了%u(无符号整数),但您传递的是指针、整数和字符串参数,我认为这就是您遇到的问题。
您应该了解一下%s、%u、%i等参数的含义。

因为有了
*
,您将取消对结构的引用,并在id和name&mdash中传递整个内容

Printf使用varargs,这基本上只是意味着您可以传入任意类型的参数,但也意味着编译器不会为您执行任何自动类型转换或检查(因为它不知道需要什么类型)。因此,传入的参数最终只是堆栈上的一个字节序列,格式字符串告诉printf如何解释该字节字符串。除此之外,它还告诉它要跳过多少字节才能进入下一个参数

因此,您需要
ptr->id
作为第一个参数,它只有4个字节。但实际上,您将结构的所有24个字节作为参数传递。因此,在printf将前4个字节打印为无符号int之后,它就可以打印下一个参数了,但仍然卡在name字段的开头。如果您查看,它打印的“垃圾”值是0x6C6544,这是4个ASCII字符“lleD”,这是您的字符串,被解释为一个小的endian整数

通常,您可能只需取消引用指针(指针同时指向结构及其第一个字段),就可以将第一个字段从结构中拉出,但前提是编译器知道您正试图根据类型执行此操作。例如,这可能会起作用:

printf("\n %p %i %s\n\n",ptr,ptr->id,ptr->name);

从技术上讲,这至少可以起作用,因为编译器知道您实际要访问的类型。实际上,编译器可能会发出错误或警告,您需要执行一些强制转换。

是的,我知道这是正确的方法,但我只是想知道为什么放置a*会导致其他2个值出错。
int id = *ptr;