C 从动态分配的2D数组中获取值

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位系统上,在

我是C编程新手,所以我可能在做一些非常愚蠢的事情。我试图从一个2D数组中获取值,该数组是我从一个文本文件~70m行中读取的

在运行代码时,我得到了一个seg错误,并将其缩小到第10行:if(I==graph[j][0])

我有变量的正确值:source。
它在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);