如何在 C 中将数组的一维 memset 为零

How to memset one dimension of an array to zero in C

假设我有一个全局声明的 3d 数组(在数据段中),我想将它的 1d 内存设置为 0。

int multi_dimension_array[x][y][z];

我可以用这条线 memset 整个事情:

memset(multi_dimension_array, 0, sizeof(multi_dimension_array));

但现在假设我只想为某个值(比如 2)设置 x 维度,这意味着 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);

我的 "issue" 是我不喜欢 memset 参数的 * y * z 部分。数组中是否有 sizeof(multi_dimension_array[2]) == byte_size_of_type * y * z?

在此示例中,我想使用数组的 属性,sizeof 将为 "x" 维度评估正确的字节数。我不想在有人更改声明中的大小并且他们不更改此 memset 的情况下使用 * y *z,而且我不喜欢它的外观。

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

这要求multi_dimension_array[i]是一个数组的数组,而不是一个指针。它之所以有效,是因为当 sizeof 应用于数组时,它 returns 是数组的大小。数组不会像大多数表达式那样自动转换为指针。

当然,它只适用于第一个维度(或前几个维度,如果你做的不止一个)。例如,您可以将一个 memset 与 array[i]array[i][j] 一起使用,但不能与 array[???][j].

等中间维度一起使用

对于这个问题的未来读者,Eric Postpischil 的回答是正确的,我已经接受了,因为它是正确的。这是一个示例程序和输出,用于演示 sizeof operator/function 应用于多维数组的情况。 一般来说,如果声明为一个整数数组

int mda[x][y][z]; 
then mda[a][b][c] == *(mda + ((a *( y* z)) + (b*z) + (c))

重要的是,至少对于我问的原始问题来说,索引到 "dimensions" 少于程序声明的数组仍然会编译和维护 "sizeof" 下一个数组。

mda[a] == *(mda + (a * (y*z))) AND sizeof(mda[a]) == sizeof(array_type) * y * z
mda[a][b] == *(mda + (a * (y*z)) + (b * z)) AND sizeof(mda[a][b]) == sizeof(array_type) * z

好的,下面是一个示例程序,您可以在线 运行 IDE 并验证:

#include <stdio.h>

#define X (4)
#define Y (10)
#define Z (5)
int multi_dimension_array[X][Y][Z];

void print_array(){
    for(int i=0; i<X; i++){
        printf("THIS IS THE %dth value of X\n", i);
        for(int j=0; j<Y; j++){
            for(int k=0; k<Z; k++){
                printf("%d ", multi_dimension_array[i][j][k]);
            }
            printf("\n");
        }
    }
}

int main(void) {
    printf("%d %d %d %d\n", sizeof(multi_dimension_array[0][0][0]), sizeof(multi_dimension_array[0][0]), sizeof(multi_dimension_array[0]), sizeof(multi_dimension_array));

    memset(multi_dimension_array,0x01,sizeof(multi_dimension_array));
    print_array();

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

    printf("\n\n\nNEXT MEMSET with the X=2 zeroed out\n\n\n");
    print_array();

    return 0;
}

这是这个程序的输出:

4 20 200 800
THIS IS THE 0th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
THIS IS THE 1th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
THIS IS THE 2th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
THIS IS THE 3th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 



NEXT MEMSET with the X=2 zeroed out


THIS IS THE 0th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
THIS IS THE 1th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
THIS IS THE 2th value of X
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
THIS IS THE 3th value of X
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 
16843009 16843009 16843009 16843009 16843009 

*请注意,memset 将每个字节设置为第二个参数的值,在本例中为 0x01,这使得 4 字节整数 0x01010101 == 16843009。