为啥这个字符会出现分段错误?

Posted

技术标签:

【中文标题】为啥这个字符会出现分段错误?【英文标题】:Why do I get a segmentation fault with this char?为什么这个字符会出现分段错误? 【发布时间】:2021-09-08 16:39:01 【问题描述】:

所以我开始学习C,尝试制作一个小程序来学习结构。它要求两个“玩家”输入他们的姓名和年龄,然后将其显示回来。

当我运行它时,在输入第二个玩家的姓氏后出现分段错误。我不明白为什么。

我尝试在gdb 中运行它并收到以下消息:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7e5288c in _IO_vfscanf () from /lib/x86_64-linux-gnu/libc.so.6

这是我的代码,struct.c

#include "struct.h"
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) 
  Person player[1];
  int i = 0;

  for (i = 0; i < 2; i++) 
    printf("\n=== Player %d ===\n", i+1);
    printf("First name : ");
    scanf("%s", player[i].firstName);
    printf("Last name : ");
    scanf("%s", player[i].lastName);
    printf("Age : ");
    scanf("%d", &player[i].age);
  

  for (i = 0 ; i < 2; i++) 
    printf("\n=== Player %d ===\n", i+1);
    printf("%s %s, %d years old", player[i].firstName, player[i].lastName, player[i].age);
  

  return 0;

这是标题,struct.h

#ifndef DEF_STRUCT
#define DEF_STRUCT
#define CHAR_SIZE 100

typedef struct Person Person;
struct Person 
  char firstName[CHAR_SIZE];
  char lastName[CHAR_SIZE];
  int age; 
;

#endif

谢谢!

【问题讨论】:

当您编译代码时,您的编译器发出了哪些警告?阅读它们... Person player[1]; 生成一个大小为1 元素的数组。 Person player[1] -> Person player[2] 从不在不限制输入长度的情况下使用scanf("%s", ...);scanf("%99s", ...); 【参考方案1】:

就像人们在 cmets 中告诉我的那样,我将 Person player[1] 替换为 Person player[2]

现在可以了。

【讨论】:

我希望你明白为什么你需要这样做。 使数组足够长以分配足够的内存,对吗?

以上是关于为啥这个字符会出现分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个向量代码会出现分段错误?

为啥这个程序在调用函数时会出现分段错误?

为啥这个 AT&T 汇编代码会出现分段错误?

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

为啥写作主要;在 C 中给出一个段错误

为啥这个字符串反转 C 代码会导致分段错误? [复制]