c - 分段故障核心(已转储)

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

工作正常,直到标记线为止。但后来我在控制台上收到此消息“段错误”。核心(已转储)。有人可以告诉我代码中有什么问题以及如何修复它吗?

最佳答案

问题#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 转换为更窄的 integer 类型 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);

然后检查错误并进行适当处理。

关于c - 分段故障核心(已转储),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40562790/

相关文章:

c - 为什么我们需要关闭 C 中的文件?

C 文件描述符复制而不共享偏移量或标志

c - POSIX 信号行为

android - 指针取消引用以访问另一个文件中的数组

c - c中stm32l中的数据损坏

c - 设备文件的文件描述符的有效性

c++ - 使用 cpputest lib 无法识别 Mock().enable 和 disable 编译测试组项目

c - 为什么recvfrom()返回错误的发送者地址?

c++ - 如何在C中定义函数指针数组

使用C计算直线的平均长度