关于C中结构的奇数输出
我尝试了一个简单的结构关于C中结构的奇数输出,c,struct,C,Struct,我尝试了一个简单的结构 #include<stdio.h> struct test { int i; int j; }; int main() { struct test t; t.i=1; t.j=2; printf("t:%d, i:%d, j:%d\n", t, t.i, t.j); } 如果我把printf语句改为 printf("i:%d, j:%d\n", t.i, t.j); 输出正确: "i:1, j:2" 为什
#include<stdio.h>
struct test
{
int i;
int j;
};
int main()
{
struct test t;
t.i=1;
t.j=2;
printf("t:%d, i:%d, j:%d\n", t, t.i, t.j);
}
如果我把printf语句改为
printf("i:%d, j:%d\n", t.i, t.j);
输出正确:
"i:1, j:2"
为什么第一个不能打印正确的输出?我是不是遗漏了什么?
我在ubuntu上使用gcc。
谢谢
这一行的第一个变量t是一个结构,您试图将其作为数字输出。
由于结构本身没有值,而是包含变量,因此将此结构t称为具有某种整数值,从而导致意外结果。打印结构时,实际上是打印前2个整数。然后t.i被打印为最后一个整数,然后t.j被忽略。之所以会出现这种情况,是因为您的结构由2个按该顺序放置在内存中的int组成。您给出的模式
printf()
告诉它应该如何读取参数序列。您告诉printf()
读取%d
,但给它一个struct测试,而不是int
。这会把整个事情搞砸,因为struct test
被转储到堆栈中,它比int
占用的空间要多得多
printf()
模式只能支持原语和指向以null结尾的字符串的指针作为参数。它无法打印struct
如果试图打印带有%d的“t”,肯定会导致编译器警告。最好不要忽视他们,他们想告诉你一些事情。不,我只是想看看结果如何。无论如何,我假设即使我尝试将结构打印为整数,它也不会影响以下结构成员的输出。所以我很困惑,你说的对!出了差错。当您在int main()中说“struct test t;”时,您创建了一种子结构。由于结构本身没有值,而是包含变量,因此将此结构t称为具有某种整数值会导致意外结果。谢谢。这样我就明白了。
"i:1, j:2"
printf("t:%d, i:%d, j:%d\n", t, t.i, t.j);