C:运行时出现“访问冲突”错误

时间:2016-06-17 14:12:21

标签: c pointers access-violation

请查看我的代码:

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,那么我将收到一个访问冲突错误。我的代码出了什么问题?

P.S。:n为10000

1 个答案:

答案 0 :(得分:4)

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]将导致超出范围的访问,如果仅分配了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;
}