我正在尝试将一个小数组复制到一个更大的数组中,我无法弄清楚如何让它工作(程序总是在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));
}
答案 0 :(得分:4)
代码似乎没问题,除了
unsigned char raster[3000*3000];
在堆栈上声明一个巨大的数组,并且你可能用完这个操作的堆栈空间(典型的堆栈大小只有几兆字节)。
尝试使用raster
将malloc
声明为动态数组。
答案 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