gpt4 book ai didi

C: "Access Violation"运行时错误

转载 作者:太空宇宙 更新时间:2023-11-04 06:19:44 28 4
gpt4 key购买 nike

请看我的代码:

adj = (int *)calloc(n * n, sizeof(int));

scanf("%d", &m);

for (i = 0; i < m; i++) {
scanf("%d %d %d", &x, &y, &w);
adjSetter(x - 1, y - 1, w);
adjSetter(y - 1, x - 1, w);
}

这部分在main函数中,adjSetter如下:

void adjSetter(int i, int j, int value) {
*(adj + (i * n + j) * sizeof(int)) = value;
}

现在的问题是当调用 adjSetter 函数时 i 超过 2500 然后我会得到一个访问冲突错误。我的代码有什么问题?

附:n 为 10000

最佳答案

i = 2500, n = 10000, j = 0, sizeof(int) = 4时,(i * n + j) * sizeof(int)将变为 100000000

*(adj + (i * n + j) * sizeof(int)) 等同于 adj[(i * n + j) * sizeof(int)],因此访问 adj[100000000] 将导致超出范围的访问,如果通过 adj = (int *)calloc(n * n, sizeof(int));.

要解决此问题,请删除有害的 * sizeof(int) 以便它可以正确访问数组的元素。

void adjSetter(int i, int j, int value) {
*(adj + (i * n + j)) = value;
}

更好的是使用数组索引,我认为这样更易于读写。

void adjSetter(int i, int j, int value) {
adj[i * n + j] = value;
}

关于C: "Access Violation"运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37883810/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com