为什么这个C程序的输出是0?
在这段代码中,我试图传递一个指向结构的指针,然后使用这个指针处理结构成员,但是为什么输出总是显示0为什么这个C程序的输出是0?,c,C,在这段代码中,我试图传递一个指向结构的指针,然后使用这个指针处理结构成员,但是为什么输出总是显示0 #include<stdio.h> #include<string.h> struct student { int go; } s; void m(); void main() { m(&s); printf("%d",s.go); } void m(struct student *ptr) { ptr->go; }
#include<stdio.h>
#include<string.h>
struct student
{
int go;
} s;
void m();
void main()
{
m(&s);
printf("%d",s.go);
}
void m(struct student *ptr)
{
ptr->go;
}
#包括
#包括
结构学生
{
int go;
}s;
无效m();
void main()
{
m&s;
printf(“%d”,s.go);
}
无效m(结构学生*ptr)
{
ptr->go;
}
创建一个全局变量。全局变量是零初始化的,除非它们被显式初始化。该声明相当于:
struct student
{
int go;
};
struct student s = {0};
因此
s.go
的值为0
。调用m
不会更改任何变量的值。它对输出没有影响。即使删除了对m(&s)
的调用,输出也将是0
。全局变量s
已使用所有成员0
初始化
没有任何更改s.go
的值,因此输出为0
- 当您将结构声明为global时,如果int小于
并且如果字符或字符串小于'0'
,则它们的成员总是使用其默认值初始化。因此,您将获得值'\0'
0
你的问题有各种各样的错误,它们在这里,没有特定的顺序:
- 如果不使用任何“字符串”函数,则不需要使用
#include
- 您不应该使用全局变量(如果使用了,则无需将指向
的指针传递给函数来访问结构);您应该删除全局变量(即使其成为局部变量),并继续将指针传递到struct,就像传递到s
一样,以便能够在m()
之外访问它(您应该在此处声明它)main()
- 您对
的签名不正确,正如我在对OP的评论中指出的那样,您自然缺少main()
返回0因此,
中的code>语句main()
printf()中缺少换行符
- 实际上,您并没有在
中使用m()
执行任何操作;您没有为它分配任何内容或以其他方式使用它。它打印零是因为,正如其他人所指出的,全局变量(因为它们是静态的)是(默认)初始化的ptr->go
s
):
#包括
结构学生
{
int go;
};
无效m();
内部主(空)
{
结构学生;
m&s;
printf(“%d\n”,s.go);
返回0;
}
无效m(结构学生*ptr)
{
ptr->go=5;
}
您希望输出是什么?添加有关该问题的更多描述?只有这样这里的人才能帮助你!因为您的编译器决定将其设置为零,而您没有对其进行更改。main()
,根据标准的规定,只有int main(void)
和int main(int argc,char**argv)
(或等效的int main(int argc,char*argv[])
;请注意main()
的返回类型——它不能是void
。您可以将问题的标题编辑为-比方说标题吗?它们是默认初始化的,而不是零初始化的,这意味着“它们的成员总是用”它们的默认值,而不是零;char
将被设置为'\0'
和整数0
。如何避免初始化为零?可以通过在main
中将s
设置为变量来避免零初始化,而不是将其设置为全局变量或显式初始化为其他变量。
struct student
{
int go;
};
struct student s = {0};
struct student
{
int go;
} s;
#include <stdio.h>
struct student
{
int go;
};
void m();
int main(void)
{
struct student s;
m(&s);
printf("%d\n", s.go);
return 0;
}
void m(struct student *ptr)
{
ptr->go = 5;
}