无需清空它。通常在 C 中,内存分配是通过malloc
它简单地返回给您一个被视为由调用者拥有的内存块完成的。当calloc
被调用时,以及返回一块内存,内存保证被初始化为 0。这意味着对于所有意图和目的,它已经是“空的”。
此外,我不太确定您的代码是否符合您的预期。让我解释一下它目前的作用:
char arg_array = (char**)calloc(strlen(buf), sizeof (char**));
这条线是完全错误的。在 C 中,不需要转换从返回的指针,calloc
因为它们是 type void *
,它被隐式地转换为任何其他指针类型。在这种情况下,您将其存储在char
没有意义的类型中。如果你这样做:
char ** arg_array = calloc(strlen(buf), sizeof (char**));
strlen(buf)
然后它分配一个长度指针数组。因此,如果buf
是,"hello"
那么您现在已经分配了一个可以存储 5 个指针的数组。
for(i = 0; i<(strlen(buf)); i++)
{
arg_array[i] = calloc (strlen(buf), sizeof(char*));
}
同样,我删除了多余的演员表。这样做是填充之前分配的数组。数组的每个索引现在都指向一个长度char
字符串。这可能不是你想要的。strlen(buf) * sizeof(char *)
你的问题现在对我来说更清楚了。您似乎想在填充字符串后删除它们。你可以通过两种方式做到这一点:
- 每个
free
指针都像以前一样稍后分配更多空间
- 或者将每个字符串的第一个字符设置为空字符
释放指针:
for(i = 0; i<(strlen(buf)); i++)
{
free(arg_array[i]);
}
要将每个字符串的第一个字符设置为空字符:
for(i = 0; i<(strlen(buf)); i++)
{
arg_array[i][0] = '\0';
}
这与您最初拥有的代码相同,应该没问题。
作为证明,以下代码将运行而不会出错:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void)
{
char * buf = "hello";
char ** arg_array = calloc(strlen(buf), sizeof (char**));
unsigned int i;
for(i = 0; i < strlen(buf); i++) {
arg_array[i] = calloc(strlen(buf),
sizeof(char *));
}
for(i = 0; i < strlen(buf); i++) {
arg_array[i][0] = '\0';
}
for(i = 0; i < strlen(buf); i++) {
free(arg_array[i]);
}
free(arg_array);
return EXIT_SUCCESS;
}
如果您的代码存在段错误,则问题来自其他地方。您是否覆盖了arg_array
变量?你确定BUFSIZE
等于strlen(buf)
?