在c中获取分段错误

时间:2016-10-09 20:19:09

标签: c pointers free

我的问题是我不确定如何正确分配内存。我研究过但无济于事。关于malloc的一些帮助会很棒。

int main(int argc, char *argv[]) {

    int i, a[5000], c = 1, m, n, input;

    scanf("%d", &input);

    for (i = 0; i <= 9999; i += 2) {

        a[c] = i;
        c++;

    }

    for (n = 2; n < 1118; n++) {

        for (m = a[n]; m < a[5000]; m++) {

            a[m] = a[m+1];
        }
    }

    printf("%d", a[input]);

    free (*a);

    return 0;
}

3 个答案:

答案 0 :(得分:2)

首先,C数组具有基于0的索引。通过将c的初始值设置为1,然后在循环中使用as作为索引,您将逐个进行操作。这会调用undefined behavior

之后,您不需要执行free (*a);a是一个数组,而不是内存分配器函数malloc()或家族返回的指针。

也就是说,在此代码中,*a根本没有给出指针,它与类型为a[0]的{​​{1}}相同。

最后,如果没有对用户提供的int值进行任何绑定检查,使用input可能会访问超出绑定的内存,从而导致UB。

FWIW,传递指向a[input]的指针,而free()先前未由malloc()和家族返回,也会调用未定义的行为。

答案 1 :(得分:2)

'a'在堆栈上分配,因此无需释放它。

您只需要释放由<Linear skipoffset="00:00:05">…</Linear>系列函数分配的变量。

答案 2 :(得分:-1)

malloc接受一个参数 - 要分配的字节数。它返回一个void指针(这是一个指向可以容纳任何数据类型的内存部分的指针)。

这是一个例子。

int *array = malloc(sizeof(int) * 10);

这将分配一个10元素的整数数组。请注意,它会使您的数据未初始化,因此数组的内容未定义。有一个名为calloc的函数, 将其初始化为零。

另外,还有一个样式提示。您可能会尝试将malloc调用的结果转换为指向您将存储在其中的数据类型的指针(例如,int *array = (int *)malloc(sizeof(int) * 10);。由于this中解释的原因,C程序员不赞成这种做法。交。