如何将动态分配的字符串添加到C中的字符串数组?

时间:2015-04-14 11:50:24

标签: c arrays string malloc valgrind

我必须编写一个函数,将给定的字符串添加到字符串数组中。

char **add_string(char **array, const char *string)
{
array = realloc(array, (sizeof(string)) * sizeof(char *));
int i = 0;
while (array[i] != NULL){        
    i++;
}
array[i] = malloc((strlen(string) + 1));
strcpy(array[i], string);   
array[i + 1] = NULL;
return array;
}

根据Valgrid的说法,目前我得到内存泄漏。我没有正确使用malloc,但我无法弄清楚如何解决它。我非常感谢你的帮助。

3 个答案:

答案 0 :(得分:1)

realloc在给定第二个参数的情况下分配一个新的大小,但你没有增加大小,所以基本上每次调用你的函数时,它都会分配相同的大小而不增加分配的区域。

您需要将数组中当前的字符串数传递给add_string,然后在add_string中将其递增

char** add_string(char** array, int* size, const char* string)
{
   char* newArray = realloc(array, (*size + 1) *sizeof(char*) );
   newArray[*size] = malloc(strlen(string)+1);
   strcpy(newArray[*size], string);
   *size += 1;

...
}

您还应该通过检查返回值来检查realloc是否成功。

通常上面的方法不是一种处理增加大小的非常有效的方法,因为你每次调用realloc都很费时。相反,你应该分块,然后跟踪你用完了多少块,当块用完时重新分配一个新块。

答案 1 :(得分:0)

array的重新分配被破坏了,它需要搜索以确定数组的长度,假设它总是"紧紧地"已分配(最后分配的元素是唯一的NULL)。

答案 2 :(得分:0)

char **add_string(char **array, const char *string){
    int i = 0;
    while (array[i] != NULL){        
        i++;//First, count the elements and find NULL element
    }
    array[i] = malloc(strlen(string) + 1);//or strdup(string);
    strcpy(array[i], string);
    char **temp;
    temp = realloc(array, (i+1+1) * sizeof(char *));
    if(temp == NULL){
        perror("realloc at add_string");
    } else {
        array = temp;
        array[i + 1] = NULL;
    }
    return array;
}