gpt4 book ai didi

c - Valgrind:地址 0x0 未被堆叠、分配或(最近)释放仅用于较大的输入值

转载 作者:行者123 更新时间:2023-12-01 10:22:07 24 4
gpt4 key购买 nike

我正在尝试使用 Dijikstra 实现,这是我拥有的图形生成代码

#include <stdlib.h>
#include <stdio.h>
#include <limits.h>
#include <math.h>
#define MAX 300
int main (int argc, char *argv[]){
int v = atoi(argv[1]);
int SIZE = v*v;
int* adjMatrix = malloc(sizeof(int)* SIZE);
graphGeneration(adjMatrix, v);
free(adjMatrix);
return 0;
}

void graphGeneration(int* adj, int numV){
int i, j, r;
for(i = 0; i< numV; i++){
for(j=0; j < numV; j++){
if(i == j){
adj[i * numV + j] = 0;
}
else{
r = rand() % MAX;
adj[i * numV + j] = r;
adj[j * numV + i] = r;
}
}
}

}

当我尝试输入一个 1000 的 v 值时,它似乎工作正常,但是当我尝试输入一个 v = 10,000+ 的值时,我得到了一个段错误(特别是在 50,000 处,我注意到了这个数字)。运行 valgrind 让我在这个方法的标题中出现错误。为方便起见,在此重新发布:

Invalid write of size 4
at 0x400800: graphGeneration
by 0x4006E3: main
Address 0x0 is not stack'd, malloc'd or (recently) free'd
Access not within mapped region at address 0x0

有人知道如何调试这个或者这里是否有任何明显的错误吗?

我在 valgrind 中也注意到了这一点

Warning: silly arg (-7179869184) to malloc()

我不确定这是否相关,但这似乎也是一件奇怪的事情。

最佳答案

看看一些malloc() manual : 它的参数是 size_t 类型是有原因的。 int 不能保证保持任何可能的对象大小,size_t 是。顺便说一句,它是无符号的——负大小没有多大意义。

那就写吧

size_t SIZE = ((size_t)v) * v;

因为你的 v 是一个 int 你必须强制这个乘法以 size_t 通过强制转换参数之一来完成。

更好的方法是使 v 成为 unsigned long 并使用 strtoul() 而不是 atoi()


然后,在使用之前检查 malloc() 的结果。即使使用正确的大小参数,它仍可能返回 NULL。如果是这样,这仅表示您当时没有足够的可用 RAM

毕竟,使用 v=10000 并假设 int 占用四个字节(这很常见),您已经尝试一次分配 400 MB。

关于c - Valgrind:地址 0x0 未被堆叠、分配或(最近)释放仅用于较大的输入值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50130968/

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