记忆混乱

时间:2011-04-27 11:08:03

标签: c memcpy

我正在尝试将一个小数组复制到一个更大的数组中,我无法弄清楚如何让它工作(程序总是在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 个答案:

答案 0 :(得分:4)

代码似乎没问题,除了

unsigned char raster[3000*3000];

在堆栈上声明一个巨大的数组,并且你可能用完这个操作的堆栈空间(典型的堆栈大小只有几兆字节)。

尝试使用rastermalloc声明为动态数组。

答案 1 :(得分:3)

对于堆栈变量,raster数组非常大(9 MB)。尝试从堆中分配它。

答案 2 :(得分:0)

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没有垃圾收集器(跟着你并且在你之后清理)。

干杯。基思。

答案 3 :(得分:0)

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