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));
6条答案
按热度按时间tvz2xvvm1#
如果二维数组具有静态存储持续时间,则默认情况下将其初始化为零,即数组的所有成员都设置为零。
如果2D数组具有自动存储持续时间,则可以使用数组初始化器列表将所有成员设置为零。
如果动态分配数组,则可以使用
memset
将所有字节设置为零。5kgi1eie2#
例如,如果你有一个整数数组,并且想显式使用memset:
不需要使用{ 0 }初始化at声明。
公正
以上都是正确的,因为为了得到正确的数组大小,数组必须先被初始化,并且数组在指针中衰减到一级。
rsl1atfo3#
简而言之:
它会将所有数组成员初始化为0。
C99标准6.7.8.21:
如果用大括号括起来的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小的数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应隐式初始化为与具有静态存储持续时间的对象相同。
egmofgnx4#
Alok保存的答案是最好的,因为它适用于任何类型的阵列。您也可以稍后重置阵列,例如:
这适用于所有类型。
如果你真的想使用
memset
,那么你可以:如果只有指向数组第一个元素的指针,则:
但是,这些版本将all-bytes-zero设置为可能不是浮点类型和指针类型的有效表示形式。
6ie5vjzr5#
下面是一个
important point
了解什么时候要使用memset()
:memset()
允许您按给定值设置内存的单个字节,而不按给定值设置整个内存。memset(arr, 1, sizeof arr);
在内部将内存的所有单个字节重置为1。例如,在32位系统中:
同样
在内部将存储器的所有单个字节重置为**-1**(1111 1111)。
0s7z1bwu6#
在C语言中,* 初始化 * 是一个特定的东西。
OP备注:
这是我定义二维数组的初始化代码,我必须创建二维动态数组,因此,我以这种方式声明它。
int **matrix; int
**back;在这个例子中,
matrix
不是一个二维数组,它是一个指向指针的指针。指针不是数组。数组不是指针。
要将指针数组分配给零
int
数据:如果必须使用
memset()
: