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

时间:2018-05-23 00:39:03

标签: c memset

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

array[0]

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:0)

对于这个问题的未来读者,Eric Postpischil的答案是正确的,我接受了它,因为它是。下面是一个示例程序和输出,用于演示sizeof运算符/函数,因为它适用于多维数组。 通常,如果声明为int数组

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

至关重要的是,至少我问的原始问题是,使用比你用程序声明的“维度”更少的数组索引仍然会编译并维护下一个数组的“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。