您的数组声明正在堆栈上分配,默认堆栈限制为8MB。当测试为29000时,堆栈分配在限制范围内(29000 * 35 * 8 = 7.7MB),当您将测试更改为30000时,您超出了堆栈限制(30000 * 35 * 8 = 8.01MB),这导致了seg故障。
您可以通过使用malloc在堆上分配数组来解决这个问题,只需记住释放您分配的内容即可。
#include <stdio.h> #include <malloc.h> struct node { char *value; }; int rows = 30000; int cols = 35; struct node **arrayofnodes; int main() { arrayofnodes = (struct node **)malloc(rows * sizeof(struct node*)); for (int row = 0; row < rows; row++) { arrayofnodes[row] = (struct node *)malloc(cols * sizeof(struct node*)); } // Use arrayofnodes // Free allocations after use... }
你要分配一个 巨大 这里的记忆量: printf("%lu\n", sizeof(arrayofnodes)); 报告说 arrayofnodes 的大小 30000 * 35 * 8 = 8400000 字节,使总内存分配 30000 * 35 * 8400000 = 8820000000000 循环中的字节数。
printf("%lu\n", sizeof(arrayofnodes));
arrayofnodes
30000 * 35 * 8 = 8400000
30000 * 35 * 8400000 = 8820000000000
你可能有意思 *arrayofnodes[p][j] - 为行指向结构的指针分配空间 p 和专栏 j 。请注意,这不包括指向的内存块的空间 char * ,这也需要 malloc 编辑。
*arrayofnodes[p][j]
p
j
char *
malloc
另外,请记住,虽然堆有足够的空间,但堆栈却没有 8 * 35 * 30000 可能不仅仅是一个堆栈框架可以处理。
8 * 35 * 30000
如果只有一个字段,请考虑避免使用结构。用一个普通的旧 char * 会避免额外的间接层。
如果您想以牺牲速度为代价来最大化空间效率,您可以尝试一次读取文本文件,为每个单元格构建一个字符串大小数组,然后 malloc 一切都相应的第二次通过。你可以用一个 char ***csv_data 包含分配给size的单元格的数组 csv_cell_size[row][col] 或类似的。
char ***csv_data
csv_cell_size[row][col]
通过维度展平数组并使用偏移量来查找特定的行/列是另一种选择。简而言之,有很多方法可以解决这个问题,很多方面取决于您的数据以及您计划如何使用它。
另外,别忘了 free() 你完成它的所有记忆。
free()