我正在做家庭作业,而且我对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;
以下是我的初始化程序的代码:
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故障之前的程序。)
如何解决此错误的方向将非常感谢!
答案 0 :(得分:3)
这一行错了:
*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);
答案 1 :(得分:1)
我认为问题在于:
*thing = *(set_t *)malloc(sizeof(set_t)*N);
thing
是一个指向int的指针。 malloc
返回指向已分配内存的指针。所以,您可能希望将该指针分配给thing
(这是一个指针),而不是将分配的内存(未初始化的)开头的内容分配给thing
指向的内容。 (a
)。
所以你需要这样做:
thing = (set_t *)malloc(sizeof(set_t)*N);
否则,当您通过*(thing+i)
分配 Bad Thing
答案 2 :(得分:1)
确定。为了符合你教授的要求,你必须做这样的事情。
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]
答案 3 :(得分:0)
教授意识到他在作业中犯了一个错误并修复了它。已将set_t a
更改为set_a *a
。
感谢您的帮助(希望我没有引起太多麻烦!