程序完成后的分段错误
我正在做一个家庭作业,我对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_t
为int*
,但由于无法更改,您可以在函数中使用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
。
感谢您的帮助(希望我没有引起太多麻烦!