C++ realloc未能分配

C++ realloc未能分配,c++,c,C++,C,我使用VS08来构建/运行下面的C++代码: #include <stdlib.h> struct Header { int count; }*lstHeader=NULL; int main() { for(int i=0;i<10;i++) { lstHeader=(Header*)realloc(lstHeader,sizeof(Header)+i); lstHeader[i].count=i; }

我使用VS08来构建/运行下面的C++代码:

#include <stdlib.h>

struct Header
{   
  int count;
}*lstHeader=NULL;

int main()
{
    for(int i=0;i<10;i++)
    {
        lstHeader=(Header*)realloc(lstHeader,sizeof(Header)+i);
        lstHeader[i].count=i;
    }
    return 1;
}

我尝试malloc lstHeader而不是将其赋值为NULL,但发生了相同的VS异常,我无法计算y。

您需要考虑当
i
变为1时会发生什么。让我们假设一个四字节整数

i==0
时,为一个
头分配足够的字节,再加上一个额外的零字节。然后将
标题[0]设置为0。计数
为0。没有问题,您只更改了分配的四个字节

i==1
时,为一个
头分配足够的字节,再加上一个额外的字节(总共五个字节)。然后将
标题[1]设置为1。这会更改内存块的字节4、5、6和7(从零开始),尽管您只有字节0到4可用。换句话说,该操作需要额外的四个字节,而不是您要求的额外的一个字节

从图形上看:

          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          | | | | | | | | | | |1|1|1|1|1|1|1|1|1|1|2|2|2|2|
offset:   |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
i=0, get: <------->
     use: <------->
i=1, get: <--------->
     use: <--------------->
i=2, get: <----------->
     use: <----------------------->
i=3, get: <------------->
     use: <------------------------------->
i=4, get: <--------------->
     use: <--------------------------------------->
i=5, get: <----------------->
     use: <----------------------------------------------->
这将确保内存分配中有足够的空间容纳所需的
元素。之所以是
i+1
,是因为初始分配必须有一个元素,即使
i
为零

          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
          | | | | | | | | | | |1|1|1|1|1|1|1|1|1|1|2|2|2|2|
offset:   |0|1|2|3|4|5|6|7|8|9|0|1|2|3|4|5|6|7|8|9|0|1|2|3|
          +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
i=0, get: <------->
     use: <------->
i=1, get: <--------->
     use: <--------------->
i=2, get: <----------->
     use: <----------------------->
i=3, get: <------------->
     use: <------------------------------->
i=4, get: <--------------->
     use: <--------------------------------------->
i=5, get: <----------------->
     use: <----------------------------------------------->
lstHeader = realloc (lstHeader, sizeof(Header) * (i+1));