Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ realloc函数没有';我不能为我保留现有的记忆_C++ - Fatal编程技术网

C++ realloc函数没有';我不能为我保留现有的记忆

C++ realloc函数没有';我不能为我保留现有的记忆,c++,C++,我使用calloc函数创建了一个包含4个单元的内存块,其中每个单元是1个字节 然后我把它分配给一个char指针,并用char值填充单元 然后使用realloc函数,我将每个单元放大到4个字节(整数大小) 然后我将它分配给一个整数指针,并在其中3个单位中填充整数 理论上,我希望内存块的第四个单元的值,我在realloc之前给出的值会被保留。但事实并非如此。当我编译时,每次我都会得到一个随机值 int main() { //create a memory block of 4 unit

我使用calloc函数创建了一个包含4个单元的内存块,其中每个单元是1个字节

然后我把它分配给一个char指针,并用char值填充单元

然后使用realloc函数,我将每个单元放大到4个字节(整数大小) 然后我将它分配给一个整数指针,并在其中3个单位中填充整数

理论上,我希望内存块的第四个单元的值,我在realloc之前给出的值会被保留。但事实并非如此。当我编译时,每次我都会得到一个随机值

 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保证将数据归零。