我有一个称为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));


        }
    }
}

最佳答案

首先,对于任何指针或数组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。我们真的不能为您提供更多帮助,因为您没有告诉我们程序应该做什么,并且由于逻辑的缺陷和错误(以及不确定的行为),我们很难尝试自己解决问题。

关于c - 为什么该程序引发Segmentation Fault异常?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50337828/

10-11 21:47