指针算术中的访问冲突

时间:2013-01-24 13:03:31

标签: c pointer-arithmetic

使用代码:

int nsize;
int * buffer;
char TargetBuffer[4096];
const SIZE_T buffersize = (320*240) * sizeof(int);


buffer = (int *) malloc(bufferSize);
// fill buffer with data

nsize = 0;
while(nsize < buffersize)
{
    // HERE after some loops i get Access Violation
    memcpy(TargetBuffer, buffer + nsize, 4096);


    // do stuff with TargetBuffer
    nsize += 4096;
}

为什么我会收到访问冲突?我应该改变什么?

3 个答案:

答案 0 :(得分:9)

当您添加buffer + nsize时,您必须意识到实际上正在添加buffer + (nsize * (sizeof(int)),因为当您进行指针运算时它是int *

所以它可能与它有关。尝试按nsize += 4096/sizeof(int)或更聪明的方式递增nsize。

答案 1 :(得分:3)

我会做这样的事情:

SIZE_T left = buffersize;
nsize = 0;

while(left)
{
    SIZE_T block = (left >= 4096)?4096:left;
    // HERE after some loops i get Access Violation
    memcpy(TargetBuffer, buffer, block);
    buffer += (left) / sizeof(*buffer);

    // do stuff with TargetBuffer
    left -= block;
}

我很确定你看到的问题是你正在走过边缘,因为你的代码没有处理不是4K倍数的大小。

答案 2 :(得分:0)

将您的while循环更新为

while(nsize < (buffersize/sizeof(int))

buffer适用于int而非charint占用多个字节,您从内存中过度计数和复制,而不是buffer的一部分。