为什么这个C程序的输出为0?

时间:2016-05-07 04:51:03

标签: 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;
}

4 个答案:

答案 0 :(得分:3)

struct student
{
   int go;
}s;

创建一个全局变量。全局变量初始化为零,除非它们被明确初始化。该陈述相当于:

struct student
{
   int go;
};

struct student s = {0};

因此s.go的值为0。对m的调用不会更改任何变量的值。它对输出没有影响。即使删除了对0的调用,输出也会为m(&s)

答案 1 :(得分:1)

全局变量s已初始化为所有成员0

没有更改s.go的值,因此输出为0

答案 2 :(得分:0)

  • 当您将结构声明为全局时,如果 int 而不是'0',并且 char或字符串而不是'\0'。所以你得到了价值0
struct student
{
    int go;
} s;

答案 3 :(得分:0)

你的问题有各种各样的错误,在这里它们没有特别的顺序:

  • 如果您没有使用任何“字符串”功能,则不需要#include <string.h>
  • 你不应该使用全局变量(如果你这样做,它将消除将指针传递给s到访问结构的函数的需要);你应该删除全局变量(即,使其成为本地变量)并继续将指针结构传递给m(),以便能够在main()之外访问它(你在那里)应该声明它)
  • 您对main()的签名不正确,正如我在对OP的评论中所指出的那样,自然您错过了return 0;中的main()声明,因为这个
  • 您错过了printf()
  • 中的换行符
  • 你实际上并没有在ptr->go中使用m()做任何事情;您没有为其分配任何内容或以其他方式使用它。它打印为零,因为正如其他人所指出的那样,全局变量(因为它们是static,)是(默认)初始化的

以下是更正示例(请注意,如果您希望在修改/设置之前使用它的值,可以按其他人的描述初始化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;
}