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