Как записать в память одно измерение массива в ноль - PullRequest
0 голосов
/ 23 мая 2018

Предположим, у меня есть трехмерный массив, объявленный глобально (в сегменте данных), который я хочу записать в 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);

Моя "проблема" в том, что мне не нравится часть * y * z параметра memset.Есть ли в массиве что-то, что говорит sizeof (multi_dimension_array [2]) == byte_size_of_type * y * z?

Я хочу использовать свойство массива, которое sizeof будет вычислять с правильным количеством байтов дляРазмер «х» в этом примере.Я не хочу использовать * y * z в том случае, если кто-то изменяет размер в объявлении, а они не меняют этот memset, плюс мне не нравится, как он выглядит.

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Для будущих читателей этого вопроса ответ Эрика Постпишила верен, и я принял его, потому что так оно и есть.Вот пример программы и выходных данных, демонстрирующих размер оператора / функции применительно к многомерным массивам.В общем, если объявлено как массив целых чисел

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.

0 голосов
/ 23 мая 2018

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

Для этого требуется, чтобы multi_dimension_array[i] был массивом массивов массивов, а не указателем.Это работает, потому что, когда sizeof применяется к массиву, он возвращает размер массива.Массив не преобразуется автоматически в указатель, как в большинстве выражений.

Конечно, он работает только для первого измерения (или первых нескольких измерений, если вы делаете более одного).Например, вы можете использовать один memset с array[i] или array[i][j], но не со средними измерениями, такими как array[???][j].

...