【发布时间】:2018-10-12 08:19:05
【问题描述】:
我正在尝试实现 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()采用什么类型的参数?二、遇到段错误时malloc()返回什么? -
@AndrewHenle 抱歉,我不确定我是否理解,但我会尽力提供详细信息。我要分配的是一维格式的二维整数数组的大小。 (命令行的输入是数组的宽度)我从编译器得到的错误只是分段错误(核心转储)
-
使用任何体面的现代编译器,您应该能够执行
sizeof(double[v][v]),因此您不必手动进行计算。然后,检查malloc的返回是否有如此大的分配。第三,用小例子尝试你的代码,这样你就有机会调试。