程序完成后的分段错误

我正在做一个家庭作业,我对C比较新。我必须为一个整数数组创建一个初始化器。

我教授给我的声明是:

typedef int set_t; // Can't be altered ... void init(set_t *thing, int N) {} // Can't be altered ... int main() { set_t a; // Can't be altered init(&a, 10); // Can't be altered return 0; } 

初始化器应该在数组set_t a;为N个元素分配空间set_t a;

这是我的初始化程序的代码:

 void init(set_t *thing, int N) { *thing = *(set_t *)malloc(sizeof(set_t)*N); for (int i = 0; i < N; i = i + 1) { *(thing+i) = i; } return; } 

一切都编译得很好但是当我运行它时,整个程序运行然后我得到一个分段错误(在我的代码副本中我有一堆运行的打印语句,因此我知道它在我之前运行整个程序得到seg错误)。

如何解决此错误的任何方向将不胜感激!

这条线错了:

 *thing = *(set_t *)malloc(sizeof(set_t)*N); // ^ // | // Here is the problem! 

malloc分配未初始化的内存,因此立即调用它是未定义的行为。 该程序可能会立即崩溃,或者可能会在一段时间后崩溃; 在你的情况下,看起来问题稍后会出现。

以下是如何解决这个问题:你需要一个双指针。 最好的方法是将typedef set_tint* ,但由于无法更改,您可以在函数中使用set_t**

 void init(set_t **thing, int N) { *thing = malloc(sizeof(set_t)*N); for (int i = 0; i < N; i = i + 1) { (*thing)[i] = i; } } 

您需要像这样调用它:

 set_t *a; init(&a, 10); 

我认为问题在于:

 *thing = *(set_t *)malloc(sizeof(set_t)*N); 

thing是指向int的指针。 malloc返回指向已分配内存的指针。 因此,您可能希望将该指针指定给thing (这是一个指针),而不是将分配的内存(未初始化的)开头的内容分配给指向的内容(即a )。

所以你需要这样做:

 thing = (set_t *)malloc(sizeof(set_t)*N); 

否则,当您通过*(thing+i)分配这是*(thing+i)时,你会在随机的内存位置四处寻找

好。 为了符合你教授的要求,你必须做这样的事情。

 void init(set_t *thing, int N) { *thing = (set_t *)malloc(sizeof(set_t)*N); for (int i = 0; i < N; i = i + 1) { ((int *) *thing)[i] = i; // it's an array } return; } 

然后在每次尝试从中获取值时将其转换为指针。 所以:

 ((int *)a)[3] 

教授意识到他在作业中犯了一个错误并修复了它。 将set_t a更改为set_a *a

感谢您的帮助(希望我没有引起太多麻烦!