堆块修改过去要求的大小为2的C错误

时间:2013-11-26 23:47:32

标签: c pointers malloc heap

因此以下代码导致错误:

// free pointers created with malloc
for (int i = 0; i < 3; i++) {
    if (rt_offset_rs[i] != NULL ) {
        free(rt_offset_rs[i]); // <== AT THiS LINE
    }

错误: 堆积在0000000000331DD0修改为0000000000331DE2过去请求的大小为2

我根本不明白这个错误。 以下是我操作指针rt_offset_rs的代码:

            char** rt_offset_rs; 
    rt_offset_rs = malloc(3 * sizeof(char*));
    if (rt_offset_rs == NULL ) {
        fprintf(outputFilePointer, "no more memory");
        exit(1);
    }

    for (int i = 0; i < 3; i++) {
        rt_offset_rs[i] = malloc(2 * sizeof(char));
        if (rt_offset_rs[i] == NULL ) {
            fprintf(outputFilePointer, "no more memory");
            exit(1);
        }
    }

2 个答案:

答案 0 :(得分:2)

错误不在free()调用,但在此之前的某个地方,只有您的系统仅在某些情况下检查溢出,其中一个是free,而不是每次写入缓冲区

它不是你的代码的一部分,但似乎你分配了两个字节,并且至少将3写入缓冲区(如果它是一个字符串 - 不要忘记null终止符是另一个字节)

答案 1 :(得分:0)

当我做类似跟随的事情时,我遇到了这个问题。

Device device = new Device(this);
device.validateLogin();

代码在 x64 构建中调用以下错误:

  

HEAP [XXX.exe]:修改为000001C207A21D60的堆块   000001C207A21DA5过去要求的尺寸为35

代码在 Win32 版本中调用以下错误:

  

HEAP CORRUPTION DETECTED:在正常块(#93)之后的0x00636110处。 CRT   检测到应用程序在堆结束后写入内存   缓冲液中。

malloc线是错误的。它应该像这样修改:

#include <malloc.h>
int main()
{
    const char* s = "123";
    void** p = (void**)malloc(1);
    *p = (void*)s;
    free(p);
}

因为指针的大小是void** p = (void**)malloc(1*sizeof(void*)); 个字节,而不是一个字节!