在C语言中,使一个二维数组归零的最快方法是什么?

102

我想在C语言中反复清零一个大的二维数组。目前我的代码如下:

// Array of size n * m, where n may not equal m
for(j = 0; j < n; j++)
{
    for(i = 0; i < m; i++)
    {  
        array[i][j] = 0;
    }
}

我尝试使用memset:

memset(array, 0, sizeof(array))

但是这只适用于1D数组。当我printf 2D数组的内容时,第一行是零,但之后我得到了很多随机的大数字,然后程序崩溃了。

13个回答

0
memset(array, 0, sizeof(int [n][n]));

1
array[n][n] 是数组中一个元素的大小,因此只有数组的第一个元素会被初始化。 - EvilTeach
糟糕。你说得对。我本意是在括号内放置一个类型签名,而不是数组查找。已经修复了。 - swestrup

0

我认为手动完成它的最快方法是以下代码。您可以将其速度与memset函数进行比较,但不应该更慢。

(如果您的数组类型与int不同,请更改ptr和ptr1指针的类型)


#define SIZE_X 100
#define SIZE_Y 100

int *ptr, *ptr1;
ptr = &array[0][0];
ptr1 = ptr + SIZE_X*SIZE_Y*sizeof(array[0][0]);

while(ptr < ptr1)
{
    *ptr++ = 0;
}

当(ptr < ptr1)时, { *ptr ++ = 0; }

对于 char 类型,您的代码很可能比 memset 函数慢。 - tofro

-2
这是因为 sizeof(array) 给出了指向多维数组第一行的指针所指对象的分配大小。然而,您分配了 j 个大小为 i 的数组。因此,您需要将一个行的大小(由 sizeof(array) 返回)乘以您分配的行数,例如:
bzero(array, sizeof(array) * j);

请注意,sizeof(array)仅适用于静态分配的数组。对于动态分配的数组,您将编写
size_t arrayByteSize = sizeof(int) * i * j; 
int *array = malloc(array2dByteSite);
bzero(array, arrayByteSize);

第一部分是错误的。对于sizeof运算符,如果它被声明为数组,则array不是指针。请参考我的答案中的示例。 - Alok Singhal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接