【问题标题】: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", ...);

标签: c struct segmentation-fault


【解决方案1】:

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

现在可以了。

【讨论】:

  • 我希望你明白为什么你需要这样做。
  • 使数组足够长以分配足够的内存,对吗?
猜你喜欢
  • 1970-01-01
  • 2019-04-17
  • 2010-10-19
  • 2013-03-28
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多