为什么这个程序会引发Segmentation fault异常?

时间:2018-05-14 19:38:16

标签: c segmentation-fault

我有一个名为drevo的2D数组。我找到了内存的两个维度,为什么它会抛出这个异常呢?

int main() {
    int n;
    int k;
    int stukaza;
    int parameter;

    scanf("%d", &n);

    int **drevo = (int **) malloc(n * sizeof(int *));

    for (int i = 0; i < n; i++) {
        *(drevo + i) = (int *) malloc(10000 * sizeof(int));
        scanf("%d", *(drevo + i));

        for (int j = 1; j < (**(drevo + i)) + 1; i++) {

            printf("%d jlk", *(drevo));
            scanf("%d", *(drevo + 2));


        }
    }
}

2 个答案:

答案 0 :(得分:3)

首先,对于任何指针或数组p和索引i,表达式*(p + i) 完全等于p[i]。这意味着您可以在使用drevo[i]的所有地方使用*(drevo + i)

虽然上述方法不能解决您的问题,但如果您将drevo视为指向数组的其他指针数组的指针,它可能会让您知道问题是什么,类似于数组数组。

所以在循环中使用

*drevo + i) = (int *) malloc(10000 * sizeof(int));
scanf("%d", *(drevo + i));

等于

drevo[i] = malloc(10000 * sizeof(int));
scanf("%d", drevo[i]);

该代码不正确,因为您将会在drevo[i][0] 中读到

然而,这仍然不是崩溃的原因,它只是错误的逻辑。

问题可能是这样的:

scanf("%d", *(drevo + 2));

等于

scanf("%d", drevo[2]);

这将读入drevo[2][0]。在外部循环的第一次迭代中 但是 ,当i == 0时,指针drevo[2] 未初始化!它没有指向任何有效的地方,并且通过取消引用该指针,您将拥有undefined behavior并且很可能是您遇到的崩溃。

尝试将所有*(drevo + i)和类似的表达式转换为drevo[i],看看它们是否都有意义。顺便说一句,它可以少写一些字符。除此之外,你应该learn how to debug your programs。我们无法真正帮助你,因为你没有告诉我们你的程序应该做什么,并且有缺陷和错误的逻辑(以及未定义的行为),它很难用来试图找到它我们自己。

答案 1 :(得分:2)

for (int j = 1; j < (**(drevo + i)) + 1; i++)

我想你想在这里增加j而不是我,但有点不清楚你想做什么。