如何在C中将数组的一维设置为零
Posted
技术标签:
【中文标题】如何在C中将数组的一维设置为零【英文标题】:How to memset one dimension of an array to zero in C 【发布时间】:2018-05-23 00:39:03 【问题描述】:假设我有一个全局声明的 3d 数组(在数据段中),我想将它的 1d 设置为 0。
int multi_dimension_array[x][y][z];
我可以用这条线来记忆整个事情:
memset(multi_dimension_array, 0, sizeof(multi_dimension_array));
但现在假设我只想将 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);
我的“问题”是我不喜欢 memset 参数的 * y * z 部分。数组中有没有说 sizeof(multi_dimension_array[2]) == byte_size_of_type * y * z 的东西?
在本例中,我想使用 sizeof 将评估为“x”维度的正确字节数的数组属性。如果有人更改声明中的大小并且他们没有更改此 memset,我不想使用 * y *z,而且我不喜欢它的外观。
【问题讨论】:
一般情况下你不能这样做。我将在 2d 示例中进行解释。数组是逐行存储的。如果要将第二行设置为某个值,则可以使用 memset,因为该行是连续的块哦内存,但是如果要设置第二列,则不能,因为该列不连续。你需要迭代。 nD 数组也是如此 【参考方案1】:memset(&multi_dimension_array[2], 0, sizeof multi_dimension_array[2]);
这要求multi_dimension_array[i]
是数组的数组,而不是指针。它之所以有效,是因为当sizeof
应用于数组时,它会返回数组的大小。数组不会像大多数表达式那样自动转换为指针。
当然,它仅适用于第一个维度(或前几个维度,如果您做多个维度)。例如,您可以将一个 memset 与array[i]
或array[i][j]
一起使用,但不能与array[???][j]
等中间维度一起使用。
【讨论】:
感谢您的回答。考虑到数组下标背后的隐式指针算法,很明显为什么会这样。【参考方案2】:对于这个问题的未来读者,Eric Postpischil 的回答是正确的,我接受了它,因为它是。这是一个示例程序和输出,用于演示 sizeof 运算符/函数应用于多维数组。 一般来说,如果声明为整数数组
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。
【讨论】:
以上是关于如何在C中将数组的一维设置为零的主要内容,如果未能解决你的问题,请参考以下文章
在 G1 中将 G1HeapWastePercent 设置为零的后果