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

Fis*_*sel 7 c arrays memset

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

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

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

aja*_*jay 7

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

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

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

如果动态分配数组,则可以使用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));
Run Code Online (Sandbox Code Playgroud)


Vor*_*mpa 6

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

int array[M][N];
Run Code Online (Sandbox Code Playgroud)

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

只是

memset(array,0,M*N*sizeof (int));
Run Code Online (Sandbox Code Playgroud)

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

  • `memset(array,0,M*N*sizeof (int));` 比 `memset(array,0,sizeof (int) * M * N);` 更好,可以防止 `M*N` 的数学溢出。 (2认同)

Alo*_*ave 1

简单地:

int array[10][10]={0};
Run Code Online (Sandbox Code Playgroud)

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


C99 标准 6.7.8.21:

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

  • @ash:我不认为OP理解她/他需要的语义。在下一句话中,她/他引用了预期的功能,这可以简单地使用上面的方法来实现,不需要`memset`。并且挑剔的是OP说“初始化”,从严格的技术意义上来说,使用“memset”不会“初始化”任何东西,它只是将内存设置为“0”。 (2认同)