为什么这个C程序会崩溃?

Lem*_*ons 2 c

我已经仔细研究了这个至少一个小时,我仍然无法找出问题所在.

#include <stdio.h>

typedef struct
{
    int Level;
    char* Name;
} Base;

Base baseStruct;

int main(int argc, char *argv[])
{
    scanf("%s", baseStruct.Name);
    scanf("%d", &baseStruct.Level);
    printf("%s :: Level %d\n", baseStruct.Name, baseStruct.Level);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

会发生什么,我去输入"Name"字符串,然后当我输入并输入整数时程序崩溃.到底是怎么回事?

Ale*_*x B 12

scanf("%s", ...)
Run Code Online (Sandbox Code Playgroud)

这需要一个缓冲(scanf需要写入它),你给它一个未初始化的指针,可能指向任何地方.

考虑执行以下操作之一:

  1. Name改为制作一个字符缓冲区:

    typedef struct
    {
        int Level;
        char Name[100];
    } Base;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从堆初始化它:

    baseStruct.Name = malloc(100); /* do not forget to cleanup with `free()` */
    
    Run Code Online (Sandbox Code Playgroud)

您还应该在scanf格式字符串中指定最大字符串长度以防止溢出:

/* assume 'Name' is a buffer 100 characters long */
scanf("%99s", baseStruct.Name);
Run Code Online (Sandbox Code Playgroud)

  • @Schedler我不确定你的意思.这正是我在答案中所说的,不是吗? (2认同)