C 动态增长的字符串数组

C 动态增长的字符串数组,c,linux,C,Linux,我试图构建一个动态增长的字符串数组。编译时既不知道字符串的数量也不知道每个字符串的长度。以下是我迄今为止提出的代码(这只是我在玩弄语法): 现在,当我打印结果[0]或结果[1]时,它只是一个空字符串,为什么结果[1]=temp;工作 这是我之前尝试过的,但没有成功,在最后一行使用realloc()时,我不断出现“无效大小”错误: char **result = NULL; result = (char **)realloc (result,sizeof(char *) * 1); result[

我试图构建一个动态增长的字符串数组。编译时既不知道字符串的数量也不知道每个字符串的长度。以下是我迄今为止提出的代码(这只是我在玩弄语法):

现在,当我打印结果[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]
临时
指向同一个内存地址:

result[0]=temp;
完成上述任务后,您可以
空闲(temp)
并尝试访问
结果[0]

free(temp);
printf ("%s \n", result[0]);
这是未定义的行为,因为您正在访问刚刚释放的内存

对于
结果[1]

  • 在第一个示例中,您在
    释放它之后使用一个字符串
  • 在第二个示例中,您是
    strcat
    ing到未分配的内存(加上未受教育的
    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");
现在,strdup
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";

你能解释一下为什么在这种情况下为什么需要增加?@ USE1073407,如果你打算修改字符串,这是很有必要的。否则,简单地存储文字是完全合法的。对代码的唯一功能是代码混淆。确保你有<代码>包含了<代码>,并且摆脱了Casts。如果你用C++来编译。MPELER,尝试写C++在第一位;)错误<代码> RealCube():无效的下一个大小< /COD> -实际上,除了“内存不足”之外,任何错误从<代码> * OLC/<代码>都是一个标志。这意味着您可能损坏了堆,覆盖了
*alloc
用来跟踪空闲块位置和大小的数据结构。当您看到该错误时,请开始查找无效的数组写入、double
free
s之类的内容。“hello”需要6个字节(5表示hello+1表示终止ASCII NUL),“hello world”需要12个字节。
result[0] = "hello";