C++ realloc函数没有';我不能为我保留现有的记忆
我使用calloc函数创建了一个包含4个单元的内存块,其中每个单元是1个字节 然后我把它分配给一个char指针,并用char值填充单元 然后使用realloc函数,我将每个单元放大到4个字节(整数大小) 然后我将它分配给一个整数指针,并在其中3个单位中填充整数 理论上,我希望内存块的第四个单元的值,我在realloc之前给出的值会被保留。但事实并非如此。当我编译时,每次我都会得到一个随机值C++ realloc函数没有';我不能为我保留现有的记忆,c++,C++,我使用calloc函数创建了一个包含4个单元的内存块,其中每个单元是1个字节 然后我把它分配给一个char指针,并用char值填充单元 然后使用realloc函数,我将每个单元放大到4个字节(整数大小) 然后我将它分配给一个整数指针,并在其中3个单位中填充整数 理论上,我希望内存块的第四个单元的值,我在realloc之前给出的值会被保留。但事实并非如此。当我编译时,每次我都会得到一个随机值 int main() { //create a memory block of 4 unit
int main() {
//create a memory block of 4 units (each 1 bytes : char size)
char *p = (char*)calloc(4,sizeof(char));
//fill the memory units with chars
p[0] = 'A';
p[1] = 'B';
p[2] = 'C';
p[3] = 'D';
//print
for(int i = 0; i< 4 ; i++){
printf("%c \n",p[i]);
}
//print integer value of third index
printf("Third index integer value : %d\n",p[3]);
printf("\n"); //space
//change the memory block so that each unit = 4 byte (size of integers)
int *B = (int*)realloc(p, sizeof(int));
p = NULL;
//fill 3 of the 4 memory units with integers
B[0] = 20;
B[1] = 25;
B[2] = 30;
//print integers
printf("%d \n", B[0]);
printf("%d \n", B[1]);
printf("%d \n", B[2]);
printf("Third index integer value : %d \n", B[3]);
printf("Third index char value : %c \n", B[3]);
return 0;
}
尝试2
A
B
C
D
Third index integer value : 68
20
25
30
Third index integer value : 42319
Third index char value : O
读取合适:其大小参数是要分配的内存的新大小。您要求它分配sizeof(int)
字节,这很可能是4
(与以前分配的大小相同)
在C风格的分配函数中,calloc
是唯一一个在单元格和单元格大小方面起作用的函数。所有其他(<代码> Malc C <代码> >代码> ReLoCU< <代码>,甚至C++分配函数<代码>::运算符new < /C>和<代码>::运算符new []/Cord>)只在原始内存大小中工作。因此,将您的呼叫更改为:
int *B = (int*)realloc(p, 4 * sizeof(int));
读取合适:其大小参数是要分配的内存的新大小。您要求它分配sizeof(int)
字节,这很可能是4
(与以前分配的大小相同)
在C风格的分配函数中,calloc
是唯一一个在单元格和单元格大小方面起作用的函数。所有其他(<代码> Malc C <代码> >代码> ReLoCU< <代码>,甚至C++分配函数<代码>::运算符new < /C>和<代码>::运算符new []/Cord>)只在原始内存大小中工作。因此,将您的呼叫更改为:
int *B = (int*)realloc(p, 4 * sizeof(int));
B[除零以外的任何内容]
超出访问范围。“然后使用realloc函数我将每个单位放大到4字节(整数大小)”是不正确的。旁注:size(char)
是一个无意义的表达式,其值定义为1
(sizeof
返回char
对象的大小)。请记住,在C中,您必须始终释放分配的内存,在C++中,最好使用容器,如“代码> STD::vector < /代码>。<代码> B [任意th-Buto0Ze] < /COD>超出范围访问。“然后使用realloc函数我将每个单位放大到4字节(整数大小)”是不正确的。旁注:size(char)
是一个无意义的表达式,其值定义为1
(sizeof
返回char
对象的大小)。请记住,在C中,您必须始终释放分配的内存,在C++中,最好使用容器,比如“代码> STD::vector < /Calp>”。FY:你在最后2个PrtFFS上看到垃圾的原因是,当你分配堆(MalC/C/AloC/CaloC)时,OS通常会给你页面大小(4K)的内存。那些书页是脏的。只有calloc保证将数据归零。仅供参考:您在最近两次打印中看到垃圾的原因是,当您分配堆(malloc/realloc/calloc)时,操作系统通常以页面大小(4k)为单位提供内存。那些书页是脏的。只有calloc保证将数据归零。