C++ realloc未能分配
我使用VS08来构建/运行下面的C++代码: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; }
#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));