动态增长的字符串数组

时间:2011-11-30 14:11:43

标签: c linux

我正在尝试构建一个动态增长的字符串数组。编译时不知道字符串的数量和每个字符串的长度。这是我到目前为止提出的代码(这只是我使用语法):

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函数在不同的子例程中被调用。是什么导致了这个问题?我怎么能绕过这个?

2 个答案:

答案 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";