为什么这个C程序的输出是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; }

在这段代码中,我试图传递一个指向结构的指针,然后使用这个指针处理结构成员,但是为什么输出总是显示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;
}
#包括
#包括
结构学生
{
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
  • 您不应该使用全局变量(如果使用了,则无需将指向
    s
    的指针传递给函数来访问结构);您应该删除全局变量(即使其成为局部变量),并继续将指针传递到struct,就像传递到
    m()
    一样,以便能够在
    main()
    之外访问它(您应该在此处声明它)
  • 您对
    main()
    的签名不正确,正如我在对OP的评论中指出的那样,您自然缺少
    返回0main()
    中的code>语句
  • 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;
}