gpt4 book ai didi

c - Realloc 触发了断点

转载 作者:行者123 更新时间:2023-11-30 16:33:05 25 4
gpt4 key购买 nike

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)] = '\0';

pc = strtok(NULL, ",");
}
for (int i = 0; a[i]; i++)
{
free(a[i]);
a[i] = NULL;
}
free(*a);
*a = NULL;

在 while 循环中。我使用 realloc 进行分配,每个元素都是 char*。当我分配第一个元素时它正常工作。但第二次分配“我住在越南”时。

    temp = (char**)realloc(a, n * sizeof(char*));

它触发了一个断点。realloc在重新分配时确实复制了所有数据,所以它肯定复制了“我是大学生”。为什么会出现这个错误?

在那之后。在释放内存部分。我没试过,但这里肯定有问题。我还没弄清楚。谢谢你帮助我

最佳答案

您使用的realloc错误:

这是错误的

temp = (char**)realloc(a, n * sizeof(char*));

if (temp)
{
a = temp;
free(temp); // <-- wrong, you cannot do that
temp = NULL;
}
...

如果realloc返回不同的指针,它将负责复制数据从旧目的地进入新目的地,它将释放旧目的地。您不必担心从旧位置释放内存。

但是,您在这里重新分配新内存,将 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

关于c - Realloc 触发了断点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49848578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com