如何在C中将数组的一个维度设置为零

Bwe*_*ebb 2 c memset

假设我有一个全局声明的3d数组(在数据段中),我想将其1d memset为0.

int multi_dimension_array[x][y][z];
Run Code Online (Sandbox Code Playgroud)

我可以用线条记住整个事情:

memset(multi_dimension_array, 0, sizeof(multi_dimension_array));
Run Code Online (Sandbox Code Playgroud)

但是现在假设我只想将x维度设置为某个值(比如2),这意味着multi_dimension_array [2] [0] [0]到multi_dimension_array [2] [y-1] [z-1]的值应该全部为零.我不认为这是一个聪明的方法来使用memset y或z,因为它们不是连续的.以下行应该有效:

memset(&multi_dimension_array[2][0][0], 0, sizeof(multi_dimension_array[2][0][0]) * y * z);
Run Code Online (Sandbox Code Playgroud)

我的"问题"是我不喜欢memset param的*y*z部分.数组中是否存在sizeof(multi_dimension_array [2])== byte_size_of_type*y*z?

我想使用sizeof将在此示例中评估为"x"维度的正确字节数的数组属性.我不想在有人改变声明中的大小并且他们不改变这个memset的情况下使用*y*z,而且我不喜欢它看起来如何.

Eri*_*hil 6

memset(&multi_dimension_array[2], 0, sizeof multi_dimension_array[2]);

这需要multi_dimension_array[i]是一个数组数组的数组,而不是指针.它的工作原理是,当sizeof应用于数组时,它返回数组的大小.与大多数表达式一样,该数组不会自动转换为指针.

当然,它仅适用于第一维(或前几个维度,如果您执行多个维度).例如,您可以使用一个带有array[i]array[i][j]不带有中间维度的memset,例如array[???][j].