程序完成后的分段错误

时间:2014-09-06 04:09:09

标签: c gcc

我正在做家庭作业,而且我对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个元素分配空间

以下是我的初始化程序的代码:

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故障之前的程序。)

如何解决此错误的方向将非常感谢!

4 个答案:

答案 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

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