试图释放未分配的地址,重新分配时出错
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' 作为 realloc
或 free
的参数。您传递给这些函数的指针必须是先前 malloc
或 realloc
(或 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
可能无效。
问题: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' 作为 realloc
或 free
的参数。您传递给这些函数的指针必须是先前 malloc
或 realloc
(或 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
可能无效。