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; }
最后一个printf语句给了我一个输出'20 1819043140 26741',其中20是正确的值,其余2个值是一些垃圾值。然而,从ptr中删除*后,我得到了一个地址值的正确输出,20,然后是另一个地址值。有人能告诉我为什么把*放在ptr前面会导致其他两个值弄乱吗?如果你使用这个,就不会更正确了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
#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;