为啥我得到以下程序的分段错误?

Posted

技术标签:

【中文标题】为啥我得到以下程序的分段错误?【英文标题】:Why I am getting segmentation fault for the below program?为什么我得到以下程序的分段错误? 【发布时间】:2018-09-22 21:10:35 【问题描述】:
int main()

  int i;
  struct student* a[4];

  a[0]->id = 20;
  a[0]->age= 22;

  a[1]->id = 23;
  a[1]->age= 24;

  a[2]->id = 25;
  a[2]->age= 26;

  a[3]->id = 27;
  a[3]->age= 28;

  for(i=0;i<4;i++)
    
    printf("%d %d \n",a[i]->id,a[i]->age);
  

  return 0;

如果没有 for 循环,值可以直接打印,但在 for 循环内 输出显示是分段错误。

【问题讨论】:

你正试图访问一个你从未分配过的内存 【参考方案1】:

正如 Umaiki 已经说过的,您访问从未分配过的内存。 与他的回答相反,我提供了一种不同的方法:

首先,这是我们定义struct的方式:

typedef struct 
    int id;
    unsigned int age;
 student;

之后,我们可以像这样在main方法中allocate the students array:

student* a = malloc(4 * sizeof(student));

现在我们可以通过&lt;index&gt; 访问学生,如下所示:

a[<index>].id = <value>;
a[<index>].age= <value>;

最后,这是一个完整的示例,说明您想要实现的(我认为),结合了我上面展示的所有 sn-ps 并包括 free 的调用(即在这种情况下可以忽略不计,因为您此后直接退出,但这是您永远不应该忘记的事情):

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

typedef struct 
    int id;
    unsigned int age;
 student;

int main() 
    student* a = malloc(4 * sizeof(student));

    a[0].id = 20;
    a[0].age = 22;

    a[1].id = 23;
    a[1].age = 24;

    a[2].id = 25;
    a[2].age = 26;

    a[3].id = 27;
    a[3].age = 28;

    for (int i = 0; i<4; i++)
    
        printf("%d %d \n", a[i].id, a[i].age);
    

    free(a);

    return 0;

【讨论】:

【参考方案2】:

您的主要问题是您试图访问未分配的内存。

从那里开始:https://www.programiz.com/c-programming/c-dynamic-memory-allocation 和 Using Dynamic Memory allocation for arrays。

你创建了一个指针并没有初始化它,所以当你尝试访问它所指向的内存时,一个很常见的segmentation faultappears...

我不知道你想做什么,但为了更正你的segfault,在这种情况下你必须创建一个forloop 来初始化你的指针数组:

struct student  ab[4];
struct student* a[4]
/* ... code ...*/
for (i=0; i<4; i++)

  a[i] = &ab[i];

/* ... code ...*/

【讨论】:

以上是关于为啥我得到以下程序的分段错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的字符串分配会导致分段错误?

为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?

为啥这个字符会出现分段错误?

为啥写作主要;在 C 中给出一个段错误

为啥这段代码在 leetcode 运行良好,但在 geeksforgeeks 出现分段错误?

为啥分段错误是由类变量顺序引起的?