realloc 错误:损坏的大小与 prev_size

Error on realloc : corrupted size vs. prev_size

我正在用 C 编写代码。 我的算法的目标是将我们在数组 str 中找到的每个字符 c 加倍。 我必须 运行 进行一些测试,对于第一个测试,我调用 doubleChar("~/fichier.txt", '~') 并且它工作正常,但是我的第二个测试是 doubleChar("une commande # commentaire", '#') 并且我从标题中得到了错误。 当我尝试调试它时,错误出现在 realloc 行上。

在调试器中我得到这个错误:

Program Received signal SIGABRT Stack trace is available in the 'Call Stack' tab

知道为什么吗?

这是我的代码:

    char * doubleChar(const char *str, char c){
assert(str!=NULL);
    char *newString=malloc(sizeof(str) * sizeof(char));
    int a = 0;
    while(str[a] != '[=11=]'){
        newString[a]=str[a];
        a++;
    }
    newString[a]='[=11=]';
    int i = 0;
    while(newString[i] != '[=11=]'){
        if(newString[i] == c){
            newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));
            for(int j=stringLength(newString)+1; j>i; j--){
                newString[j]=newString[j-1];
            }
            i++; //we add 1 to i so we don't find the char we just added
        }
        i++;
    }
    return newString;
}
char *newString=malloc(sizeof(str) * sizeof(char));

由于 strconst char *sizeof(str)const char * 在您的平台上占用的字节数。那不是你想要的。您要传递给 malloc 的是要存储的字符串的长度,确保为终止零保留一个额外的字节。在本例中,即 (strlen(str) + 1).

newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));

这可能也是错误的。您需要 (strlen(newString) + 2) 为新添加的字符保留一个字节,为零终止符保留一个字节。不过很难确定,因为我不知道你的 stringLength 函数是做什么的。

此外,根据定义,sizeof(char) 是一个。 sizeof 函数 returns 字符大小。

strlen(newString) + 2stringLength(newString)*sizeof(char) + sizeof(char) 更容易理解,因为 strlen 是一个标准函数,而 sizeof(char) 冗长难看。所以我强烈建议将其更改为 strlen(newString) + 2.