спутанность сознания - PullRequest
       5

спутанность сознания

0 голосов
/ 27 апреля 2011

Я пытаюсь скопировать небольшой массив в больший массив, и я не могу понять, как заставить его работать (программа всегда падает на Visual Studio 2008 x32)

Работа memcpy для

   memcpy( raster+(89997000), abyRaster, sizeof(abyRaster));

но не

   memcpy( raster+(line*3000), abyRaster, sizeof(abyRaster));

Я просто хочу, чтобы это работало в цикле for, но я запутался в арифметике указателей и размере int и unsigned char.

Идеи?

    unsigned char raster[3000*3000];

    unsigned char abyRaster[3000*1];

    for( int line=0; line<3000;line++ ) {

        int arrayPosition = line*3000;

        memcpy( raster+(arrayPosition), abyRaster, sizeof(abyRaster));          
    }

Ответы [ 4 ]

4 голосов
/ 27 апреля 2011

Код выглядит нормально, за исключением того, что

unsigned char raster[3000*3000];

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

Попробуйте объявить raster как динамический массив, используя malloc.

3 голосов
/ 27 апреля 2011

Этот массив raster достаточно большой (9 МБ) для переменной стека.Попробуйте выделить его из кучи.

0 голосов
/ 21 марта 2016
The program can not be run directly because of not enough memory 
If the system supports high enough the memory allocated by the program. then  
the program copies bytes of a variable abyRaster to another variable on     
every position (line*3000) of  variable raster.
abyRaster[0] is copied to  raster[0]
abyRaster[1] is copied to  raster[3000]
abyRaster[2] is copied to  raster[6000]
  :                             :
  :                             :
int line=0; line<3000;line++ used to identify only the index values of array 
0 голосов
/ 27 апреля 2011

portoalet,

http://www.cplusplus.com/reference/clibrary/cstring/memcpy/ говорит:

void * memcpy ( void * destination, const void * source, size_t num );
destination : Pointer to the destination array where the content is to be copied, type-casted to a pointer of type void*.
source      : Pointer to the source of data to be copied, type-casted to a pointer of type void*.
num         : Number of bytes to copy. 

Лично я нахожу синтаксис "адрес элемента" (ниже) гораздо более понятным, чем эквивалентный синтаксис "база массива плюс индекс" ... особенно когда вы попадаете в Коррекции-в-массивы-из-Структуры.

memcpy( &raster[arrayPosition], abyRaster, sizeof(abyRaster));  

И кстати: я согласен с другими предыдущими постерами ... все, что больше "одной строки" (скажем, 4096 байт), должно быть выделено в куче ... в противном случае вы ОЧЕНЬ быстро исчерпаете пространство стека. Просто НЕ ЗАБЫВАЙТЕ освободить ВСЕ, что у тебя есть malloc ... куча не самоочищается, как стек, а ANSI C не имеет сборщика мусора (чтобы следить за тобой и убирать за тобой).

Приветствия. Кит.

...