realloc 触发断点
Realloc triggered a breakpoint
int n = 0;
char s[] = "I am a college student, I live in Vietnam";
char **a = NULL;
char **temp = NULL;
char* pc = strtok(s, ",");
while (pc)
{
n++;
temp = (char**)realloc(a, n * sizeof(char*));
if (temp)
{
a = temp;
free(temp);
temp = NULL;
}
else
{
for (int k = 0; k < n; k++)
{
free(a);
a = NULL;
}
free(*a);
*a = NULL;
}
a[n - 1] = (char*)malloc((strlen(pc) + 1) * sizeof(wchar_t));
strcpy(a[n - 1], pc);
a[n - 1][strlen(pc)] = '[=10=]';
pc = strtok(NULL, ",");
}
for (int i = 0; a[i]; i++)
{
free(a[i]);
a[i] = NULL;
}
free(*a);
*a = NULL;
在 while 循环中。我使用 realloc 来分配每个元素是 char*。当我分配第一个元素时它工作正常。但是在我第二次分配的时候 "I live in Vietnam".
temp = (char**)realloc(a, n * sizeof(char*));
已触发断点。
realloc在reallocate的时候确实复制了所有的数据,所以肯定是复制了"I am a college student"。为什么会出现这个错误?
之后。在释放内存部分。我没试过,但一定是这里出了问题。我还没弄明白。
谢谢你帮助我
您使用的realloc
错误:
这是错误的
temp = (char**)realloc(a, n * sizeof(char*));
if (temp)
{
a = temp;
free(temp); // <-- wrong, you cannot do that
temp = NULL;
}
...
如果realloc
returns一个不同的指针,它会负责复制数据
从旧目的地进入新目的地,它将释放旧目的地。
您不必担心从旧位置释放内存。
这里你重新分配新的内存,设置a
到重新分配的内存
并立即再次释放它。然后您正在访问已释放的内存。
这会产生未定义的行为。
你要做的是:
temp = realloc(a, n * sizeof *a);
if(temp == NULL)
{
// DO the error handling
for(int k = 0; k < n; ++k)
free(a[i]);
free(a);
break; // or return
}
a = temp;
a[n - 1] = malloc(strlen(pc) + 1);
...
您确定要为 a[i]
分配 (strlen(pc) + 1) * sizeof(wchar_t)
字节吗?你真的在处理
wchar_t
字符串在这里?在那种情况下,最好将 a
声明为 wchar_t **a
相反。
另请注意:do not cast malloc
int n = 0;
char s[] = "I am a college student, I live in Vietnam";
char **a = NULL;
char **temp = NULL;
char* pc = strtok(s, ",");
while (pc)
{
n++;
temp = (char**)realloc(a, n * sizeof(char*));
if (temp)
{
a = temp;
free(temp);
temp = NULL;
}
else
{
for (int k = 0; k < n; k++)
{
free(a);
a = NULL;
}
free(*a);
*a = NULL;
}
a[n - 1] = (char*)malloc((strlen(pc) + 1) * sizeof(wchar_t));
strcpy(a[n - 1], pc);
a[n - 1][strlen(pc)] = '[=10=]';
pc = strtok(NULL, ",");
}
for (int i = 0; a[i]; i++)
{
free(a[i]);
a[i] = NULL;
}
free(*a);
*a = NULL;
在 while 循环中。我使用 realloc 来分配每个元素是 char*。当我分配第一个元素时它工作正常。但是在我第二次分配的时候 "I live in Vietnam".
temp = (char**)realloc(a, n * sizeof(char*));
已触发断点。 realloc在reallocate的时候确实复制了所有的数据,所以肯定是复制了"I am a college student"。为什么会出现这个错误?
之后。在释放内存部分。我没试过,但一定是这里出了问题。我还没弄明白。 谢谢你帮助我
您使用的realloc
错误:
这是错误的
temp = (char**)realloc(a, n * sizeof(char*));
if (temp)
{
a = temp;
free(temp); // <-- wrong, you cannot do that
temp = NULL;
}
...
如果realloc
returns一个不同的指针,它会负责复制数据
从旧目的地进入新目的地,它将释放旧目的地。
您不必担心从旧位置释放内存。
这里你重新分配新的内存,设置a
到重新分配的内存
并立即再次释放它。然后您正在访问已释放的内存。
这会产生未定义的行为。
你要做的是:
temp = realloc(a, n * sizeof *a);
if(temp == NULL)
{
// DO the error handling
for(int k = 0; k < n; ++k)
free(a[i]);
free(a);
break; // or return
}
a = temp;
a[n - 1] = malloc(strlen(pc) + 1);
...
您确定要为 a[i]
分配 (strlen(pc) + 1) * sizeof(wchar_t)
字节吗?你真的在处理
wchar_t
字符串在这里?在那种情况下,最好将 a
声明为 wchar_t **a
相反。
另请注意:do not cast malloc