0

我还是 C 的新手,我正在尝试清空 2d 字符数组。这是声明:

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;
}

任何帮助表示赞赏

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

空就是让它空——我该如何解释更多?哈哈

4

2 回答 2

1

无需清空它。通常在 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)

于 2012-04-23T22:43:08.160 回答
1

尝试这个:

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 是数组的列数。

PS 这个函数会清除整个数组,就像你应该做的那样。正如我之前评论的那样,将 '\0' 作为字符串中的第一个字符并不会清除整行,它只会使其余部分 ,, 对于 printf 等函数不可见。检查此链接以获取更多信息:http ://cplusplus.com/reference/clibrary/cstdio/printf/

于 2012-04-23T22:51:17.593 回答