Trie树的底层数组已经是全局变量了,而我们知道,全局变量的内存是在堆上分配的,所以这不是栈空间不足的问题。
可以注意到,每个Trie树节点里放了1+1+27=29个int,而程序开了N=100000个节点,也就是29*N = 2900000个int的空间,2900000*sizeof(int)/1024/1024 = 11mb,11mb的空间在堆上分配绰绰有余,所以不会是内存不够大。
我copy程序下来跑了一遍,首先我不知道你的dic.dic文件的格式,所以我用txt来模拟,运行,出现内存读错误。
检查了一下发现
for(sl=0;sl
这句话,如果遇到空行是没办法结束的,我改成了
for(sl=0;slif(str[sl]=='/' || str[sl] == '\n')
break;接着是
str[sl]='{';这句,我看不出让其等于{的意义,这也不符合常识,应该改成
str[sl]='\0';这样子insert函数才能正常结束while(*s)循环。
最后是
d[L]={'a','b','a','c','o'};这句,这样的初始化字符数组方法是不会在末位自动补上'\0'的,会导致find函数无法正常工作。所以要把L的值定义为6,即
#define L 6然后将这个句子改成
d[L]={'a','b','a','c','o','\0'};做了这些修改后,程序正常运行,也得到想要的结果。可以验证不是内存不足的问题。
栈空间不够,这种大数据量一般使用动态内存分配,将内存空间分配到堆上去
// 分配内存
struct Trie *tree = NULL;
tree = (struct Trie *)malloc(N * sizeof(struct Trie));
// 回收内存
free(tree);
这种问题当然是用链表了。
写一个结构体链表,然后再做一个结构体索引,可以加快查找速度
能否简单谈谈你的编程思想
可以把数组定义放在main的外面,也就是Intmain 的前面