我必须编写一个函数,将给定的字符串添加到字符串数组中。
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,但我无法弄清楚如何解决它。我非常感谢你的帮助。
答案 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;
}