如何在二维数组中使用memset函数初始化C中的成员?

如何在二维数组中使用memset函数初始化C中的成员?,c,arrays,memset,C,Arrays,Memset,我想知道如何在C语言的二维数组中使用memset()函数 我不想在那个数组中遇到任何垃圾问题。如何初始化此数组 有人能给我解释一下如何做到这一点吗?简单地说: int array[10][10]={0}; 它将把所有数组成员初始化为0 C99标准6.7.8.21: 如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同 Alok Save的答案是最好的,因为它适用于任

我想知道如何在C语言的
二维数组中使用
memset()
函数

我不想在那个数组中遇到任何垃圾问题。如何初始化此数组

有人能给我解释一下如何做到这一点吗?

简单地说:

int array[10][10]={0};
它将把所有数组成员初始化为0


C99标准6.7.8.21:

如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同


Alok Save的答案是最好的,因为它适用于任何类型的数组。您也可以稍后重置阵列,例如:

{
    T const blank[10][10] = { 0 };
    STATIC_ASSERT(sizeof blank == sizeof array);
    memcpy(&array, &blank, sizeof array);
}
这适用于所有类型

如果您确实想使用
memset
,则可以执行以下操作:

memset(&array, 0, sizeof array);
如果只有指向数组第一个元素的指针,则:

memset(ptr, 0, number_of_elements * sizeof *ptr);

但是,这些版本将所有字节设置为零,这可能不是浮点类型和指针类型的有效表示形式。

如果2D数组具有静态存储持续时间,则默认将其初始化为零,即数组的所有成员都设置为零

如果2D数组具有自动存储持续时间,则可以使用数组初始值设定项列表将所有成员设置为零

int arr[10][20] = {0};  // easier way
// this does the same
memset(arr, 0, sizeof arr); 
int *arr = malloc((10*20) * (sizeof *arr));
// check arr for NULL

// arr --> pointer to the buffer to be set to 0
// 0 --> value the bytes should be set to
// (10*20*) * (sizeof *arr) --> number of bytes to be set 
memset(arr, 0, (10*20*) * (sizeof *arr));
如果动态分配数组,则可以使用
memset
将所有字节设置为零

int arr[10][20] = {0};  // easier way
// this does the same
memset(arr, 0, sizeof arr); 
int *arr = malloc((10*20) * (sizeof *arr));
// check arr for NULL

// arr --> pointer to the buffer to be set to 0
// 0 --> value the bytes should be set to
// (10*20*) * (sizeof *arr) --> number of bytes to be set 
memset(arr, 0, (10*20*) * (sizeof *arr));

例如,如果您有整数和整数数组,并且希望显式使用memset:

int array[M][N];
您不需要使用{0}在声明处初始化

只是

以上所有内容都是正确的,因为为了获得正确的数组大小,必须先初始化数组。
数组在指针中衰减到一个级别。

答案取决于数组是使用堆栈内存还是使用堆内存定义的。无论是在堆栈上还是在堆上,按照Op的要求使用memset都是一样的。当然,使用memset并不总是最好的方法。一种解决方案-如果使用malloc(),请尝试calloc()。如果需要使用memset并需要帮助确定数组大小,请发布一些代码,说明如何分配数组。这是我定义二维数组的初始化代码,我必须创建二维动态数组,因此,我是这样宣布的。int**矩阵;int**背面;Op特别要求memset。@ash:我认为Op不理解他/她需要什么的语义。在接下来的一句话中,他/她引用了预期的功能,这可以简单地用上面的方法实现,不需要
memset
。为了挑剔,Op说“初始化”,从严格的技术意义上讲,使用
memset
不会“初始化”任何东西,它只是将内存设置为
0
。我明白你的意思。同时,memset可用于“初始化”空间,即设置其初始值。不管怎样,提问可以澄清这一点。否则,答案真的需要针对所提出的问题。请记住,Op可能会在任何平台上使用许多C编译器中的任何一个,任何年龄段的编译器。。。我并不是说这个答案在任何方面都不好——只是它没有回答“如所问”的问题。我明白了。只是想让你知道——如果我在搜索Op的确切问题,即如何在多维数组中使用memset,并找到了你的答案,那么无论声誉如何或年头如何都无济于事。很抱歉,您觉得输入的声誉和时间会凌驾于所有其他判断或有效输入之上。@AlokSave正如ash告诉您的那样,我得出您的答案是因为我想记忆一个二维数组,而不是初始化它。这里,最后-使用记忆集的答案。要使用memset,请找到数组的起始地址(这很简单——如果您希望更明确的话,它是数组变量的值,或者是所有索引都为0的元素的地址)。然后找到数组的长度;这可能更棘手。一旦两者都知道了,就调用memset。