分段故障核心(转储)

时间:2016-11-12 12:22:54

标签: c

这是我获取学生详情的代码。

#include <stdio.h>

struct det{
    char fname[25], lname[25], shift[10], sec[2];
    int roll, clss, id;
};

int details();

int main(){
    details();

    getchar();
    getchar();

    return 0;
}

int details(){
    char rl;
    FILE *fp;
    struct det n;

    printf ("\n Enter Student Informations Below : \n\n");

    printf (" First Name : ");
    scanf ("%s",&n.fname);

    printf (" Last Name : ");
    scanf ("%s",&n.lname);

    printf (" Roll : ");
    scanf ("%d",&n.roll);

    rl = (char) n.roll + ".txt";

    fp = fopen(rl, "w");

    printf (" ID : ");
    scanf ("%d",&n.id);

    printf (" Class : ");
    scanf ("%d",&n.clss);

    printf (" Shift : ");
    scanf ("%s",&n.shift);

    printf (" Section : ");
    scanf ("%s",&n.sec);

    // Works fine till here. Shows in console that segmentation fault, core dumped.

    fprintf (fp, "\n Name : %s %s\n", n.fname, n.lname);
    fprintf (fp, " Class : %d\n Roll : %d\n ID : %d\n", n.clss, n.roll, n.id);
    fprintf (fp, " Section : %s\n Shift : %s\n", n.sec, n.shift);

    fclose(fp);

    printf ("\n\n Details Stored.\n\n Press Enter To Exit...");

    return 0;
}

在标记线之前正常工作。但后来我在控制台上发现了这条消息“Segmentation fault”。核心(甩)。有人可以告诉我代码中有什么问题以及如何修复它?

1 个答案:

答案 0 :(得分:1)

问题#1

char fname[25];
scanf ("%s",&n.fname);

正如elsewhere所解释的那样,这似乎有效,但这是错误的。使用scanf("%s", fname);

问题#2

rl = (char) n.roll + ".txt";

这个语句没有连接字符串,正如你可能想要做的那样; C中的二进制+运算符不能像那样工作。这里发生了什么:

  • ".txt"是“指向char的指针”类型的表达式,指向序列的第一个元素(C11 6.3.2.1p3
  • (char) n.rollint投射到较窄的整数类型char,从而丢弃了一些信息。如果您需要char,请使用char,否则请记录其目的
  • (char) n.roll是整数类型,因此如果其值N在[0,4]范围内,则结果为“指向char的指针”并指向第N个元素数组对象,否则行为未定义 (C11 6.5.6p8
  • 结果被分配给rl,类型为char,这意味着您正在尝试分配一个指向整数的指针(并且应该看到一个警告,说明的确是这样)

如果你想安全地创建一个包含“NNN.txt”形式字符串的字符串,你可以使用像snprintf这样的字符串格式化函数:

char buffer[MAXIMUM_FILENAME_SIZE];
snprintf (buffer, sizeof buffer, "%d.txt", n.roll);

然后检查错误并妥善处理。