C 动态增长的字符串数组
我试图构建一个动态增长的字符串数组。编译时既不知道字符串的数量也不知道每个字符串的长度。以下是我迄今为止提出的代码(这只是我在玩弄语法): 现在,当我打印结果[0]或结果[1]时,它只是一个空字符串,为什么结果[1]=temp;工作 这是我之前尝试过的,但没有成功,在最后一行使用realloc()时,我不断出现“无效大小”错误:C 动态增长的字符串数组,c,linux,C,Linux,我试图构建一个动态增长的字符串数组。编译时既不知道字符串的数量也不知道每个字符串的长度。以下是我迄今为止提出的代码(这只是我在玩弄语法): 现在,当我打印结果[0]或结果[1]时,它只是一个空字符串,为什么结果[1]=temp;工作 这是我之前尝试过的,但没有成功,在最后一行使用realloc()时,我不断出现“无效大小”错误: char **result = NULL; result = (char **)realloc (result,sizeof(char *) * 1); result[
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]
和临时
指向同一个内存地址:
result[0]=temp;
完成上述任务后,您可以空闲(temp)
并尝试访问结果[0]
:
free(temp);
printf ("%s \n", result[0]);
这是未定义的行为,因为您正在访问刚刚释放的内存
对于结果[1]
- 在第一个示例中,您在
释放它之后使用一个字符串
- 在第二个示例中,您是
ing到未分配的内存(加上未受教育的strcat
没有意义)realloc(结果[0]
char **result = NULL;
result = realloc(result, sizeof(char *) * 1);
result[0] = strdup("hello");
/* ... */
result = realloc(result, sizeof(char *) * 2);
result[1] = strdup(" world");
现在,strdupstrdup
不是标准的,但偷它/伪造它并不难。这里有一个尝试:
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";
你能解释一下为什么在这种情况下为什么需要增加?@ USE1073407,如果你打算修改字符串,这是很有必要的。否则,简单地存储文字是完全合法的。对代码的唯一功能是代码混淆。确保你有<代码>包含了<代码>,并且摆脱了Casts。如果你用C++来编译。MPELER,尝试写C++在第一位;)错误<代码> RealCube():无效的下一个大小< /COD> -实际上,除了“内存不足”之外,任何错误从<代码> * OLC/<代码>都是一个标志。这意味着您可能损坏了堆,覆盖了
*alloc
用来跟踪空闲块位置和大小的数据结构。当您看到该错误时,请开始查找无效的数组写入、doublefree
s之类的内容。“hello”需要6个字节(5表示hello+1表示终止ASCII NUL),“hello world”需要12个字节。
result[0] = "hello";