2014-10-03 2 views
1

Есть ли способ скопировать каждый элемент из одного многомерного массива в другой многомерный массив, выполнив только одну операцию memcpy?memcpy для многомерного массива

int array1[4][4][4][4]; 
int array2[4][4][4][4]; 
int main() 
{ 
    memset(&array1,1,sizeof(array1)); 
    memset(&array2,0,sizeof(array2)); 
    printf_all("value in array2 %d \n",array2[1][1][1][1]); 
    memcpy(&array2,&array1,sizeof(array2)); 
    printf("memcopied in array2 from array1 \n"); 
    printf("value in array2 %d \n",array2[1][1][1][1]); //not printing 1 
} 

ответ

1

Ваш код верный. Вы должны не ожидать вывод, чтобы показать вам значение 1. Вы должны ожидать, что он покажет вам значение 16843009, предполагая 4 байт int.

Причины: вы заполняете array1 с байтами значения 1, а не с Интсом стоимости 1. то есть бинарный 00000001000000010000000100000001 (0x01010101) заполняется во всех элементах int с помощью операции memset.

Так что независимо от размера int на вашем компьютере (если только это не байт!), Вы не должны ожидать значения 1.

Надеюсь, это поможет.

1

Да, ваш код уже должен быть верным.

При этом необходимо учитывать расположение памяти. Массивы все в одном блоке, многомерность - это, по сути, математический трюк, сделанный компилятором.

В коде содержится копия этого содержимого памяти в другой блок памяти. так как оба имеют один и тот же макет, они будут содержать одинаковые значения.

Следующий код также просто копирует значения, но доступ обрабатывается по-разному, поэтому вам нужно подумать о том, как правильно получить порядок элементов.

int array1[4][4][4][4]; //elements 256 
int array2[256]; 

int main() 
{ 
    memcpy(&array2,&array1,sizeof(array1)); //will also copy 
    // original access via: a + 4 * b + 16 * c + 64 * d 
} 
+0

Зачем вам нужно что-либо учитывать?'array1' и' array2' имеют один и тот же тип, поэтому должно быть возможно присвоить значения, скопировав базовое представление. –

+0

Предположим, вы хотели скопировать что-то другое. Как массив char * или большой буфер символов, где элементы разделены на \ 0. Говоря так, это кажется очевидным, но это из реального мира. – Johannes

0

Многомерный массив в C - это плоский блок памяти без внутренней структуры. Макет памяти многомерного массива точно такой же, как у 1-мерного массива того же общего размера. Многомерный интерфейс реализуется посредством простого пересчета индексов. Вы всегда можете указать memcpy весь многомерный массив точно так же, как вы это делаете в своем коде.

Это, конечно, относится только к встроенным многомерным массивам, явно объявленным как таковым (как в примере кода). Если вы реализуете многомерный массив вручную как массив указателей на подматрицы, эта структура данных не будет скопирована одним выстрелом с memcpy.

Однако, по-видимому, у вас есть некоторые заблуждения относительно того, как работает memset. Ваш memset(&array1,1,sizeof(array1)); не заполнит массив 1 s, что означает, что ваш код не должен печатать 1 независимо от того, какой массив вы печатаете. memset интерпретирует целевую память как массив char s, а не как массив int s.

memset может использоваться для установки памяти на ноль. Что касается ненулевых значений, то memset обычно непригоден для инициализации массивов любого типа, кроме char.

Смежные вопросы