试图将int读入结构体,但它返回段错误?

时间:2017-07-25 12:27:41

标签: c struct malloc

所以我有这个代码读取字符串并将它们应用到各自的结构成员中,但是一旦我进入读取int,我的程序崩溃并返回段错误。但是,如果我为变量赋值,然后将该值传递给结构,它可以正常工作。如果我为一个变量分配一个值,用scanf覆盖该值,然后将其传递给struct,它会再次发生段错误。

void createcompetitor() {
    struct competitor *newcompetitor = malloc(sizeof (struct competitor));
    if (newcompetitor == NULL)
        return;
    printf("Please enter the competitor's first name\n");
    fgets(newcompetitor->firstname, 25, stdin);
    printf(newcompetitor->firstname);
    printf("Please enter the competitor's last name\n");
    fgets(newcompetitor->lastname, 35, stdin);
    printf(newcompetitor->lastname);
    printf("Please enter the competitor's address\n");
    fgets(newcompetitor->address, 105, stdin);
    printf(newcompetitor->address);
    printf("Please enter the competitor's age\n");
    scanf("%d", &newcompetitor->phonenumber);
    scanf("%c");
    printf("%d", newcompetitor->age);
    printf("Please enter the competitor's phone number\n");
    scanf("%d", &newcompetitor->phonenumber);
    scanf("%c");
    printf("%d", newcompetitor->phonenumber);
    printf("Please enter the competitor's registration number\n");
    scanf("%d", &newcompetitor->competitornumber);
    scanf("%c");
    printf("%d", newcompetitor->competitornumber);
}

对于超级凌乱的代码感到抱歉,我只想弄清楚程序究竟发生了什么。

编辑: 结构定义是

struct competitor {
    char firstname[20];
    char lastname[30];
    char address [100];
    int age;
    int phonenumber;
    int competitornumber;
    struct competitor *next;
};

2 个答案:

答案 0 :(得分:3)

请注意不匹配

char firstname[20];

并且

fgets(newcompetitor->firstname, 25, stdin);

您允许写入数组边界之外,这是未定义的行为。

scanf("%c");是另一个罪魁祸首。

scanf从stdin读取输入并尝试将其写入为参数传递的地址,但您没有传递任何地址!

整个程序的行为未定义。感谢它只会崩溃。

如果您打算在继续之前等待用户交互,请以scnaf的格式指定应该读取该字符,但不能在任何地方写入。像这样:

`scanf("%*c");`

然而,这是一个脆弱的等待用户互动"技术。所以记住这一点。

答案 1 :(得分:1)

您的段错很可能是由

引起的
printf(newcompetitor->firstname);

printf()应该像这样使用:

printf("%s\n", newcompetitor->firstname);

当且仅当您有一个没有变量的字符串文字时,您可以将它与一个参数一起使用,否则您需要同时提供format string和正确数量的variable names