如何在C中清空2d char数组?

时间:2012-04-23 22:28:21

标签: c arrays string

我仍然是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;
}

感谢任何帮助

所以,我做得对,因为当我尝试再次将数据添加到数组然后打印时,这似乎给了我段错误吗?

空只是把它弄空 - 我怎么解释更多?洛尔

2 个答案:

答案 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/