Самый быстрый способ обнулить 2d массив в C? - PullRequest
84 голосов
/ 25 марта 2010

Я хочу многократно обнулить большой двумерный массив в 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))

Но это работает только для одномерных массивов. Когда я печатаю содержимое 2D-массива, первая строка равна нулю, но затем я получаю массу случайных больших чисел, и она вылетает.

Ответы [ 12 ]

0 голосов
/ 25 марта 2010
memset(array, 0, sizeof(int [n][n]));
0 голосов
/ 25 марта 2010

Это происходит потому, что sizeof (массив) дает вам размер размещения объекта, на который указывает массив .( array - это просто указатель на первую строку вашего многомерного массива).Однако вы выделили j массивов размером i .Следовательно, вам нужно умножить размер одной строки, который возвращается sizeof (массивом), на количество выделенных вами строк, например:

bzero(array, sizeof(array) * j);

Также обратите внимание, что sizeof (массив) будет работать только длястатически размещенные массивы.Для динамически размещенного массива вы должны написать

size_t arrayByteSize = sizeof(int) * i * j; 
int *array = malloc(array2dByteSite);
bzero(array, arrayByteSize);
...