C 从动态分配的2D数组中获取值
我是C编程新手,所以我可能在做一些非常愚蠢的事情。我试图从一个2D数组中获取值,该数组是我从一个文本文件~70m行中读取的 在运行代码时,我得到了一个seg错误,并将其缩小到第10行:if(I==graph[j][0]) 我有变量的正确值:source。C 从动态分配的2D数组中获取值,c,pointers,graph-theory,dynamic-allocation,C,Pointers,Graph Theory,Dynamic Allocation,我是C编程新手,所以我可能在做一些非常愚蠢的事情。我试图从一个2D数组中获取值,该数组是我从一个文本文件~70m行中读取的 在运行代码时,我得到了一个seg错误,并将其缩小到第10行:if(I==graph[j][0]) 我有变量的正确值:source。 它在convertToCSR方法中隔离故障。您正在使用num_rows存储大于int容量的数字 因此,由于溢出,int num_rows的实际值不是69000000 尝试改用长的无符号整数行。并且您的系统至少有264个MiB(在32位系统上,在
它在convertToCSR方法中隔离故障。您正在使用
num_rows
存储大于int容量的数字
因此,由于溢出,int num_rows的实际值不是69000000
尝试改用
长的无符号整数行
。并且您的系统至少有264个MiB(在32位系统上,在64位系统上为双精度)连续可用内存,用于您要为图形
分配的内存?否malloc
调用返回空指针?在我的main方法中,我能够在填充图形后获得值。但是,当我调用此方法时,它seg faults为什么不检查malloc()
返回值。在gdb
中运行,然后执行bt
它所说的操作?仅仅因为它看起来有效并不意味着它实际上有效。这是其中一个问题(你可能在什么地方遇到过)。我在x86_64上需要1104000000
字节(69000000*(每个指针8个字节+2 int的8个字节))。仅对于分配的存储来说,这是1.1G—可行,但很大。这不会为读取处理任何额外的内存。您需要验证每个分配,以确保malloc
不会失败。
void convertToCSR(int source, int maxNodes, int maxEdges, int* vertices, int* edges, int** graph) {
int i;
int j;
int edge = 0;
for (i = 0; i < maxNodes; i++) {
vertices[i] = edge;
for (j = 0; j < maxEdges; j++) {
if (i == graph[j][0]) {
//Sets edges[0] to the first position
edges[edge] = graph[j][1];
printf("new edge value: %d\n", edge);
edge++;
}
}
}
vertices[maxNodes] = maxEdges;}
int num_rows = 69000000;
graph = (int**) malloc(sizeof(int*) * num_rows);
for(i=0; i < num_rows; i++){
graph[i] = (int*) malloc(sizeof(int) * 2 );
}
readInputFile(file);
int source = graph[0][0];
convertToCSR(source, maxNodes, maxEdges, nodes, edges, graph);