试图释放未分配的地址,重新分配时出错

Attempting to free address that was not malloced , error on realloc

问题:https://leetcode.com/problems/find-and-replace-in-string/

"""

char * findReplaceString(char * s, int* indices, int indicesSize, char ** sources, int sourceSize, char ** targets, int targetSize){

int len = strlen(s);
char *copyS;
char *copy = (char*) malloc(sizeof(char)*len);
memcpy(copy, s, sizeof(char)*len);
copyS = copy;
int x = indicesSize-1;
int indexArr[1001] = {0};
int y;

for(int j=0; j<indicesSize; j++)
{
    indexArr[indices[j]] = j;
}

qsort(indices, indicesSize, sizeof(int), cmp);

while((x >= 0))
{
    y = indexArr[indices[x]];
    copy = copyS+(indices[x]);
    if(!(strncmp(copy, sources[y], strlen(sources[y]))))
    {
        copy = (char *)realloc(copy, sizeof(char)*(sizeof(copy) + sizeof(targets[y])));
        strcpy(copy, targets[y]);
    }
        
    x--;
}
return copyS;

}

由于使用了 realloc,我遇到了运行时错误。我试图修改输入字符串 's'。由于重新分配而出现运行时错误:尝试释放未分配的内存。 所以我分配了新的字符串指针,*复制。当我在 copy

上使用 realloc 时仍然出现同样的错误

一旦你这样做了

copy = copyS+(indices[x]);

您不能再使用 'copy' 作为 reallocfree 的参数。您传递给这些函数的指针必须是先前 mallocrealloc(或 calloc

返回的值

将原始 'copy' 保存在变量中,例如 'originalCopy'

代码有几个问题。

对于初学者来说,不清楚指针 copy 指向的动态分配数组是否应包含字符串。

如果它应该包含一个字符串,那么

char *copy = (char*) malloc(sizeof(char)*len);
memcpy(copy, s, sizeof(char)*len);

你需要写

char *copy = (char*) malloc(sizeof(char)*( len + 1 ));
memcpy(copy, s, sizeof(char)*( len + 1 ));

也不清楚为什么在此声明中使用幻数1001

int indexArr[1001] = {0};

指针copyS被分配了初始分配内存的地址

char *copyS;
char *copy = (char*) malloc(sizeof(char)*len);
memcpy(copy, s, sizeof(char)*len);
copyS = copy;

但是你正在尝试重新分配内存

copy = (char *)realloc(copy, sizeof(char)*(sizeof(copy) + sizeof(targets[y])));

因此,指针 copyS 可能具有无效值。并且这个具有无效值的指针从函数返回

return copyS

依次在 while 循环中改变指针 copy

while((x >= 0))
{
    y = indexArr[indices[x]];
    copy = copyS+(indices[x]);
    //..

所以在这样的分配之后它并没有指向之前分配的内存范围。因此在 realloc

的调用中使用指针
copy = (char *)realloc(copy, sizeof(char)*(sizeof(copy) + sizeof(targets[y])));

调用未定义的行为。

再说一遍

    copy = copyS+(indices[x]);

也会调用未定义的行为,因为在内存重新分配后指针 copyS 可能无效。