Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中清空2d字符数组?_C_Arrays_String - Fatal编程技术网

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

如何在C中清空2d字符数组?,c,arrays,string,C,Arrays,String,我还是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*)); } char arg_数组=(char**)calloc(strlen(buf),sizeof(char**))

我还是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*));
}
char arg_数组=(char**)calloc(strlen(buf),sizeof(char**));

对于(i=0;i不需要清空它。通常在C中,内存分配是通过
malloc
完成的,它只向您返回一个被认为是调用方拥有的内存块。当调用
calloc
时,以及向您返回一个内存块时,内存保证被初始化为0。这意味着对于所有意图和p但它已经是“空的”

另外,我不太确定您的代码是否达到了预期效果。让我解释一下它目前的作用:

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*));
}
要将每个字符串的第一个字符设置为空字符,请执行以下操作:

for(i = 0; i<(strlen(buf)); i++)
{
  arg_array[i][0] = '\0';
}
对于(i=0;i请尝试以下操作:

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;
    }
void使_为空(字符**arg_数组,int行,int列)
{
int i,j;

对于(i=0;i)您只是在修改每个子数组的第一个元素……而在您的上下文中什么是“空的”?使用另一个类似于j的变量,然后使用它创建一个从0到columnSize-1的内部for循环。将BUFSIZE更改为rowSize-1您可以通过将char*的第一个字符设置为null plug来清空它。(即使像我这样的noob也知道这一点。)在这里,我假设您可以将其应用于2d数组,但当我“为空”时它使用这个函数并尝试重用它,我得到了seg错误。通过将“\0”放在它所指向的字符串的第一个位置来清空char*不是真的。它只会使printf之类的函数将其视为空的零长度字符串。如果出现问题,char**只是数组的指针,程序将不知道数字是什么数组的行和列的r,因此必须将它们分别传递给函数。另外,正如有人之前所说,如果调用2d数组,则不必清空它,因为calloc用零填充它。wookie88-我可以将此应用于2d数组吗?我用单词填充它,然后需要再次清空它。我相信我在问题中已经说过了。所以这个答案可能不是我想要的。你不应该在循环中使用
sizeof(char*)
sizeof(char)
(这是非常不必要的),而不是
sizeof(char**)
sizeof(char*)
。@twain249:是的,我没有纠正这个问题。
sizeof(char**)
用于OP可能意味着
sizeof(char*)
的地方。但是,这两个值是相等的。
sizeof(char)
在我的答案中没有任何地方使用。@MikeKwan我的意思是你有
arg\u数组[I]=calloc(strlen(buf),sizeof(char*);
应该是
sizeof(char)
或者干脆
1
@twain249:是的,我注意到这可能不是他在我的回答中想要的。
memset
在这里是一个简单得多的选择。我知道,但我认为通过这个例子,问题的作者更容易理解他误解了什么(见问题下面的评论);)。
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;
}
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;
    }