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

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

发生的事情是,我去输入“名称”字符串,然后当我键入并输入整数时,程序崩溃了。这是怎么回事?

最佳答案

scanf("%s", ...)

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

考虑执行以下操作之一:

  1. 改为将 Name 设为字符缓冲区:

    typedef struct
    {
        int Level;
        char Name[100];
    } Base;
    
  2. 从堆中初始化它:

    baseStruct.Name = malloc(100); /* do not forget to cleanup with `free()` */
    

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

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

关于c - 为什么这个 C 程序会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3877665/

相关文章:

c pointer assignment to pointer to pointer 是什么意思

c - 一个程序,打印用户使用函数输入的星号数量并将值传递给该函数

c - 从 C、Xcode 中的文件中读取整数

c - array undeclared , first used in the function error during dynamic memory allocation 数组未声明,首次用于动态内存分配期间的函数错误

c - 整数比较失败

java - 利息数量

c++ - 返回 const char*;静电有多难看?

c++ - Makefile,在src目录树中查找源代码并在构建文件中编译为.o

c - scanf() 将换行符保留在缓冲区中

c - 错误: Struct not defined correctly