我正在尝试构建一个动态增长的字符串数组。编译时不知道字符串的数量和每个字符串的长度。这是我到目前为止提出的代码(这只是我使用语法):
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]);)
现在,当我打印结果[0]或结果[1]时,它只是一个空字符串,为什么不产生[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 ***
现在在我的程序中,“result”被声明为一个全局变量(使用我的代码的第二个版本),并且realloc函数在不同的子例程中被调用。是什么导致了这个问题?我怎么能绕过这个?
答案 0 :(得分:2)
以下语句使result[0]
和temp
指向相同的内存地址:
result[0]=temp;
完成上述作业后,您free(temp)
并尝试访问result[0]
:
free(temp);
printf ("%s \n", result[0]);
这是未定义的行为,因为您正在访问刚被解除分配的内存。
对于result[1]
的相同代码也是如此。
答案 1 :(得分:2)
freeing
it strcat
未分配内存(加上未受过教育的realloc(result[0]
没有意义)你可以试试这个:
char **result = NULL;
result = realloc(result, sizeof(char *) * 1);
result[0] = strdup("hello");
/* ... */
result = realloc(result, sizeof(char *) * 2);
result[1] = strdup(" world");
现在strdup
不是标准的,但是偷它/假它并不困难。这是一次尝试:
char *strdup2(const char *str)
{
size_t len;
char *rval = NULL;
len = strlen(str); /* We should probably check this. */
rval = malloc(len + 1); /* And this. */
memcpy(rval, str, len);
rval[len] = 0;
return rval;
}
我想要稍后修改字符串(可能是错误的)。如果不是这样,只需存储它们(没有strdup
)就足够了:
result[0] = "hello";