c-realloc错误:大小相对于prev_size已损坏



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

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

程序接收信号SIGABRT堆栈跟踪在"调用堆栈"选项卡中可用

知道为什么吗?

这是我的代码:

char * doubleChar(const char *str, char c){
assert(str!=NULL);
char *newString=malloc(sizeof(str) * sizeof(char));
int a = 0;
while(str[a] != ''){
newString[a]=str[a];
a++;
}
newString[a]='';
int i = 0;
while(newString[i] != ''){
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函数返回以字符为单位的大小。

理解strlen(newString) + 2要比理解stringLength(newString)*sizeof(char) + sizeof(char)容易得多,因为strlen是一个标准函数,而sizeof(char)又冗长又丑陋。所以我强烈建议将其更改为strlen(newString) + 2

最新更新