C:“;访问违规”;运行时出错

C:“;访问违规”;运行时出错,c,pointers,access-violation,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); } 现在的问题是,当调用ADJSETER函数时,i超过2500,那么我将得

请看我的代码:

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);
}
现在的问题是,当调用ADJSETER函数时,i超过2500,那么我将得到一个访问冲突错误。我的代码怎么了


注意:当
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;
}

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;
}

.您有一些未声明的变量。请贴一张。
*sizeof(int)
Hmmm,这有味道。了解指针算术。不测试scanf的返回值总是令人惊讶。您有一些未声明的变量。请贴一张。
*sizeof(int)
Hmmm,这有味道。了解指针算术。不测试scanf的返回值总是要求惊喜。谢谢你的回答。不幸的是,这是一个类似于家庭作业的ACM竞赛的算法。这就是分配约束。我不知道该怎么办?!什么是“这些”?导致超出范围的访问?只需删除
sizeof int
,这完全是错误的。这是真的,我必须删除该sizeof(int)。谢谢all@MikeCAT请编辑您的答案,强调删除sizeof(int),这解决了我的问题。非常感谢。谢谢你的回答。不幸的是,这是一个类似于家庭作业的ACM竞赛的算法。这就是分配约束。我不知道该怎么办?!什么是“这些”?导致超出范围的访问?只需删除
sizeof int
,这完全是错误的。这是真的,我必须删除该sizeof(int)。谢谢all@MikeCAT请编辑您的答案,强调删除sizeof(int),这解决了我的问题。谢谢。