我正在尝试构建一个动态增长的字符串数组。编译时不知道字符串的数量和每个字符串的长度。这是我到目前为止想出的代码(这只是我在玩语法):
char **result = NULL;
char *temp = NULL;
result = (char **)realloc (result,sizeof(char *) * 1);
temp= (char *)realloc(temp,5 * sizeof(char));
strcat(temp,"hello");
temp= (char *)realloc(temp,10 * sizeof(char));
strcat(temp," world");
printf ("%s \n", temp);
result[0]=temp;
free(temp);
printf ("%s \n", result[0]);
result = (char **)realloc (result, sizeof(char *) * 2);
temp= (char *)realloc(temp,10 * sizeof(char));
strcat(temp,"0123456789");
temp= (char *)realloc(temp,15 * sizeof(char));
strcat(temp,"asdfg");
printf ("%s \n", temp);
result[1]=temp;
free(temp);
printf ("%s \n", result[0]);
printf ("%s \n", result[1]);)
现在,当我打印 result[0] 或 result[1] 时,它只是一个空字符串,为什么不是 result[1]=temp;工作?
这是我之前尝试过的,但没有奏效,在最后一行使用 realloc() 时,我不断收到“无效大小”错误:
char **result = NULL;
result = (char **)realloc (result,sizeof(char *) * 1);
result[0]= (char *)realloc(result[0],5 * sizeof(char));
strcat(result[0],"hello");
printf ("%s \n", result[0]);
result[0]= (char *)realloc(result[0],10 * sizeof(char));
strcat(result[0]," world");
printf ("%s \n", result[0]);
result = (char **)realloc (result, sizeof(char *) * 2);
result[1]= (char *)realloc(result[1],10 * sizeof(char));
strcat(result[0],"0123456789");
result[0]= (char *)realloc(result[1],15 * sizeof(char));
strcat(result[0],"asdfg");
如果有人可以帮助我使任一版本正常工作,我将不胜感激。
更新:好的,我让两个版本的代码都可以工作。现在,当我尝试在实际程序中使用这种相同的格式时,我会收到诸如
*** glibc detected *** ./uvicfmt3: realloc(): invalid next size: 0x08ed3170 ***
现在在我的程序中,“结果”被声明为一个全局变量(使用我的代码的第二个版本),并且在不同的子例程中调用 realloc 函数。这是导致问题的原因吗?我怎么能解决这个问题?
最佳答案
以下语句使 result[0]
和 temp
指向相同的内存地址:
result[0]=temp;
完成上述任务后,您然后
free(temp)
并尝试访问 result[0]
:free(temp);
printf ("%s \n", result[0]);
这是未定义的行为,因为您正在访问刚刚释放的内存。
对于
result[1]
的相同代码也是如此。关于c - 动态增长的字符串数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8327231/