C: "Access Violation" 运行时错误
C: "Access Violation" error on runtime
请看我的代码:
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
当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));
.
仅分配了 100000000 个元素
要解决此问题,请删除有害的 * 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;
}
请看我的代码:
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
当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;
}