2014-02-26 68 views
0
FILE *fp; 
char *in; 
char *sa[20]; 
char inn[100]; 

//other stuff here 

for(huge loop) { 
    fp = popen(filename, "r"); 
    fscanf(fp, "%100s", inn); 
    in = strtok(inn, "="); 
    i = 0; 
    while(in != NULL) { 
     sa[i++] = in; 
     in = strtok (NULL, "="); 
    } 
} 

这在我的linux机器上编译并运行了大约4分钟,因为它会对大量数据文件进行排序,然后进行分段错误。它直到这一点都正确运行,并且这一点取决于我做了多少事情,所以我强烈怀疑有内存泄漏,我应该释放指针。但我认为没有malloc编译器会自动分配并取消分配指针内存。我究竟做错了什么?指针,内存不足,分段错误?

谢谢。

+2

你在哪里做'pclose'? –

+1

另外,你知道'strtok'不会返回唯一的指针,并且它返回指向它标记的字符串的指针?这意味着'sa'中的所有*指针将指向'inn'中的不同位置。如果'inn'是一个局部变量而'sa'不是,那么你在你之前就有麻烦了。 –

+0

不检查'popen()'的返回值是邪恶的。 – Asblarf

回答

2

您将不会在inn阵列中留出空终止符。

对于每个popen没有pclose

您不检查返回值popen。我们不保证您不会溢出sa数组。

+0

就是这样。它现在运行完成。谢谢!我想我应该不那么懒惰,并检查客栈和popen的价值。一个数组类型不能用我的数据类型溢出(理论上)。 –

+0

@MatthewClarkson外部来源的数据永远不应该被信任,尤其是当这种信任可能导致崩溃时。为什么要避免一个简单的'if'测试?您的程序无疑是I/O限制的,因此它对性能的影响为0%。毫无疑问,“popen”可以并且会失败。不检查它是坚果。 –