【问题标题】:Why do I get a segmentation fault with my use of printf?为什么我在使用 printf 时会出现分段错误?
【发布时间】:2011-12-23 03:34:53
【问题描述】:

我是 C 编程的初学者。我在使用 printf 函数时遇到了麻烦。当我运行以下程序时,我遇到了分段错误。 请告诉我我做错了什么。 分段错误实际上是什么意思?

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

typedef struct
{
        char *name;
        int rollnum;
        int marks;
}
student_data;

int main()
{
        student_data stud1;                                             
        student_data *ptr;                                              

        ptr = (student_data *)malloc(sizeof(student_data));


        printf("\n NAME OF THE STUDENT:         " );
        scanf("%s", &ptr -> name);

        printf("\n ROLL NUMBER OF THE STUDENT:  " );
        scanf("%d", &ptr -> rollnum);

        printf("\n MARKS OF THE STUDENT:        " );
        scanf("%d", &ptr -> marks);


        printf("\nPRINTING ROLL NUMBER      %d", ptr -> rollnum);
        printf("\nPRINTING MARKS            %d", ptr -> marks);
        printf("\nPRINTING NAME             %s", ptr -> name);


}

-:输出:-

学生姓名:ajish

学生卷数:2

学生成绩:60

2 号印刷辊 印刷标记 60 分段错误

【问题讨论】:

  • 你很幸运:字符串“ajish”被写入了你计算机内存中的一个未知位置,并且计算机没有崩溃。上次我尝试这样的事情时,我的电脑开始向窗户走去,如果我没有停下来,它就会自行抛出:-)
  • @pmg :-)) xkcd.com/293
  • @pmg +1 这个好评论!!

标签: c printf


【解决方案1】:

您忘记为student_data.name 分配一些内存。 根据scanfdocumentationptr-&gt;name 应该指向一个已经分配的内存缓冲区。

【讨论】:

    【解决方案2】:

    您永远不会为名称分配内存。

    【讨论】:

    • 还有scanf("%s", &amp;ptr -&gt; name);中引用运算符的问题。
    【解决方案3】:

    scanf("%s", &ptr -> name);

    你永远不会分配 ptr->name。

    【讨论】:

      【解决方案4】:

      您没有为 ptr-&gt;name 分配存储空间。

      【讨论】:

        【解决方案5】:

        您没有初始化 ptr -&gt; name,这会导致使用 ptr-&gt;name 在其余代码中出现未定义的行为。

        malloc 之后和第一个printf 之前添加ptr-&gt;name = (char*) malloc(1000); memset (ptr-&gt;name, 0x00, 1000);

        一般说明:

        您需要始终初始化指针。使用scanf you need to be aware that you must allocate/provide enough space to hold whatever might be entered/read (as stated in the documentation) 时,您会遇到内存管理、安全性和数据完整性问题(如缓冲区溢出等)。

        【讨论】:

        • 或者,更简单的是,使用数组而不是指针来定义结构:struct { char name[2000]; /* ... */ };
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 1970-01-01
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多