我有一个函数,它接受一个字符串并删除它的某些部分。
这个函数做了几次,直到突然之间,相同的malloc线运行良好,崩溃,没有可用的源#34; 0xb7e88a81"错误。
试图清除所有事情,以确保我没有发送NULL长度或其他什么,但仍然没有运气。
它至少工作了一次(调试过),但在第二次或第三次迭代时它崩溃了。
char *removeOffsetFromLabel (char *label) {
char* labelWithoutOffset;
int i;
labelWithoutOffset = malloc(strlen(label));
........
崩溃发生在malloc线上(当试图移动到下一行时)。
strlen(label)= 7(选中)
有什么想法吗?我在Eclipse(Ubuntu)上使用GCC编译器。
Per FoggyDay的请求这是整个功能:
char *removeOffsetFromLabel (char *label) {
char* labelWithoutOffset;
int i;
labelWithoutOffset = (char*)malloc(strlen(label) + 1);
i = 0;
while (label[i] != '\0' && label[i] != OPENING_BRACKET_ASCII_CODE) {
labelWithoutOffset[i] = label[i];
i++;
}
labelWithoutOffset[i] = '\0';
return labelWithoutOffset;
}
我释放了" labelWithoutOffset"在再次调用它之前的函数之外。
答案 0 :(得分:3)
我希望我能用V符号标记你的所有答案,以表明它已经解决了问题,因为你最有帮助。
在深入研究之后,我对代码进行了两处更改,到目前为止似乎工作正常:
再一次,我感谢大家向我展示了我在代码中遇到的其他问题。
StackOverflow ROCKS!
答案 1 :(得分:2)
1)如上所述,“malloc()”必须“strlen()+ 1”:
char *removeOffsetFromLabel (char *label) {
char* labelWithoutOffset = (char *)malloc(strlen(label)+1);
2)由于这没有解决问题,我们还需要看看:
a)当我们调用strlen()时,“label”是否有效?
b)你有没有可能在其他地方覆盖“labelWithoutOffset”的代码 - 你在一次通话中分配后,再在另一次通话中再次分配它之前?
SUGGESTIONS:
a)添加此代码(或者更好,在调试器中查看“label”):
char *removeOffsetFromLabel (char *label) {
fprintf (STDERR, "label=%s\n", label);
fprintf (STDERR, "strlen(label)=%d\n", strlen(label);
char* labelWithoutOffset = (char *)malloc(strlen(label)+1);
b)从“removeOffsetFromLabel()”发布更多代码 - 也许我们可以看到变量可能会“踩到”。
PS: 如果您有野心,请查看我上面的Valgrind教程的链接。
但是对于“快速结果”,请尝试建议1)和2);让我们知道它是怎么回事。
答案 2 :(得分:1)
如果strlen(label)确实是7,那么它不是strlen()而是malloc()本身崩溃。
如果malloc()崩溃,那可能意味着malloc()的内部管理在早期/其他地方被破坏(通过指针变得疯狂)。
这样的错误很难(最难)找到,因为你不知道它们在哪里,因为崩溃可能在事故发生很久之后发生。
您可能希望了解Valgrind的用法。
答案 3 :(得分:-2)
抓一点。
我不明白那里有什么函数类型,但据我所知的malloc();和字符串,因为label是一个数组,你应该像这样发送它
void funcCall(int *)
main()
{
funcCall(label)
}
funcCall(int funcLabel[])
{
}
希望这会有所帮助。