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

时间:2014-04-13 04:32:32

标签: c arrays memset

我想知道如何在C中的memset()中使用two dimensional array函数。

我不想面对该阵列中的任何垃圾问题。如何初始化此数组?

有人能解释我如何实现它吗?

4 个答案:

答案 0 :(得分:5)

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

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

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

如果动态分配数组,则可以使用memset将所有字​​节设置为零。

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

答案 1 :(得分:1)

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

但是,这些版本设置all-bytes-zero,这可能不是浮点类型和指针类型的有效表示。

答案 2 :(得分:0)

简单地:

int array[10][10]={0};

它会将所有数组成员初始化为0。


C99标准6.7.8.21:

  

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

答案 3 :(得分:0)

如果您有例如整数数组并且想显式使用 memset:

int array[M][N];

您不需要在声明时使用 { 0 } 进行初始化。

只是

memset(array,0,M*N*sizeof (int));

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