我仍然是C的新手,我正在尝试清空一个二维char数组。这是宣言:
char arg_array = (char**)calloc(strlen(buf), sizeof (char**));
for(i = 0; i<(strlen(buf)); i++)
{
arg_array[i] = (char*) calloc (strlen(buf), sizeof(char*));
}
这是我尝试清空的地方:
void make_empty(char **arg_array)
{
int i;
for(i = 0; i <= BUFSIZ; i++)
{
arg_array[i][0] = '\0';
}
return;
}
感谢任何帮助
所以,我做得对,因为当我尝试再次将数据添加到数组然后打印时,这似乎给了我段错误吗?
空只是把它弄空 - 我怎么解释更多?洛尔
答案 0 :(得分:1)
没有必要清空它。通常在C中,内存分配是通过malloc
完成的,它只会返回一个被调用者认为拥有的内存块。当调用calloc
时,以及返回一块内存,保证内存初始化为0.这意味着对于所有意图和目的,它已经是“空的”。
此外,我不太确定您的代码是否符合您的意图。让我解释一下它目前的作用:
char arg_array = (char**)calloc(strlen(buf), sizeof (char**));
这条线完全错了。在C中,不需要转换从calloc
返回的指针,因为它们是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;
}
如果您的代码是segfaulting,则问题来自其他地方。你有没有覆盖arg_array
变量?您确定BUFSIZE
等于strlen(buf)
吗?
答案 1 :(得分:0)
试试这个:
void make_empty(char **arg_array, int rows, int cols)
{
int i,j;
for(i = 0; i <rows; i++)
{
for(j=0; j<cols;j++)
{
arg_array[i][j] = '\0';
}
}
return;
}
其中rows是行数和cols数组cols的数量。
P.S。此函数会像您应该一样清除整个数组。正如我之前评论的那样,将'\ 0'作为字符串中的第一个字符串并不会清除整行,它只会使其余部分变为“不可见”,因为像printf这样的函数。请查看此链接以获取更多信息:http://cplusplus.com/reference/clibrary/cstdio/printf/