为啥我得到以下程序的分段错误?
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));
现在我们可以通过<index>
访问学生,如下所示:
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 fault
appears...
我不知道你想做什么,但为了更正你的segfault
,在这种情况下你必须创建一个for
loop 来初始化你的指针数组:
struct student ab[4];
struct student* a[4]
/* ... code ...*/
for (i=0; i<4; i++)
a[i] = &ab[i];
/* ... code ...*/
【讨论】:
以上是关于为啥我得到以下程序的分段错误?的主要内容,如果未能解决你的问题,请参考以下文章
为啥调用 glCreateShader 时这个 OpenGL 着色器分段错误?