C语言 为什么此程序会引发分段错误异常?



我有一个名为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]未初始化的!它不会指向任何有效的地方,并且通过取消引用该指针,您将拥有未定义的行为,并且很可能是您正在经历的崩溃。

尝试将所有*(drevo + i)和类似的表达式转换为drevo[i],看看它们是否都有意义。顺便说一下,要写的字符少了几个。除此之外,您应该学习如何调试程序。我们无法真正为您提供更多帮助,因为您没有告诉我们您的程序应该做什么,并且由于逻辑有缺陷和错误(以及未定义的行为(,很难尝试自己弄清楚。

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

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

相关内容

  • 没有找到相关文章

最新更新