C中free()函数的问题



我在for循环中有一个while循环来处理字符串。下面是我代码的基本结构:

char myString[1000];
//Initialize and maybe change myString
for(/*conditions*/){
    while(/*conditions*/){
        if(strchr(myString,' ') == NULL){
            break;
        }
        char *temp = malloc(sizeof(char) * strlen(myString));
        strcpy(temp,myString);
        *strchr(temp,' ') = '';
        strcat(myString," ");
        strcat(myString,temp);
        free(temp);
    }
}

有时,这段代码工作得很好,但有时过程结束并返回3,这意味着有一个错误(3是我通常得到的返回值,当我尝试使用NULL,我不应该喜欢例如myPointer->example,其中myPointer是NULL)。经过一些测试,我发现引起问题的行是free(temp);。我试图用if(temp != NULL){free(temp);}代替它,但它没有改变任何东西。我试图用char temp[1000]而不是malloc来声明temp,并拿走free(temp);行,但它仍然做同样的事情。如果我拿走free(temp);行,仍然使用malloc,问题就解决了,但有一个巨大的内存泄漏,所以我不能这样做。如果有一个错误与否取决于什么是在myString字符串,这意味着,如果有一个特定的值在那里,总是有一个错误,如果有另一个特定的值,永远不会有一个错误,但我无法找出什么类型的值工作,哪些不,它似乎是随机的。

为什么free(temp);有时工作,有时不,我怎么能让它总是工作?

主要问题是,您分配的元素比所需的内存少一个。

strlen()没有考虑到终止null,因此您缺少所需的内存。之后,做

strcpy(temp,myString);

实际上是超出边界的访问(存储终止的null),会调用未定义的行为。因此,您可以看到

有时,这段代码工作得很好,但有时进程结束并返回3,这意味着有一个错误[....]

要解决这个问题,您应该修改分配语句,如
char *temp = malloc(strlen(myString) + 1); // +1 for terminating null,
                                           // sizeof(char) == 1, guaranteed by C standard.

也就是说,从手册页

strchr()strrchr()函数返回一个指向匹配字符的指针,如果没有找到该字符则返回NULL。[…]

,对于高亮显示的场景,

*strchr(temp,' ') = '';

试图解引用一个无效的空指针常量(NULL),再次调用UB。在解引用返回的指针
之前检查是否有有效的返回值

相关内容

  • 没有找到相关文章

最新更新