• 扩展堆数组的大小


    函数:

    void* realloc(void *ptr, size_t size);

    功能: 函数将ptr 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。

    扩展内存

     1 int main()
     2 {
     3     const size_t pSize = 15;
     4 
     5     char *p = new char[pSize]{0};
     6     strcpy_s(p, pSize, "I LOVE YOU");
     7 
     8     cout << "p:" << hex << (int)p << endl;
     9 
    10     p = (char *)realloc(p, pSize * 2);
    12 
    13     if (!p)
    14         cerr << "Call realloc function error!" << endl;
    15 
    16 
    17     cout << "p1:" << hex << (int)p << endl;
    18     _snprintf_s(p, pSize * 2, pSize * 2, "Hello,%s C++!", p);
    19     cout << p<< endl;
    20 
    21     delete[]p;
    22 
    23     getchar();
    24     return 0;
    25 }

    如果没有

    p = (char *)realloc(p, pSize * 2);

    这句代码,程序将在Call _snprintf_s function时崩溃,因为p指向的内存放不下那么多的数据。

    这句代码的意思是在原有的内存上扩展内存。如果原有的内存上没有连续的pSize *2那么大的空闲内存,则重新分配内存,并把原内存上的数据copy到新内存
    有了足够大的内存空间,那么Call _snprintf_s function时就不会发生溢出的情况了。


    删除内存
     1 int main02()
     2 {
     3     const size_t pSize = 100;
     4     char *p = new char[pSize]{0};
     5     strcpy_s(p, pSize, "I LOVE YOU, Jia Yin!");
     6 
     7     // p = (char *)realloc(p, strlen(p) + 1);
     9     if (!p)
    10         cerr << "Call realloc function error!" << endl;
    11 
    12     _snprintf_s(p, pSize, pSize, "%s..........", p);
    13 
    14     cout << p << endl;
    15     delete[] p;
    16 
    17 
    18     getchar();
    19     return 0;
    20 }
     p = (char *)realloc(p, strlen(p) + 1);     如果加了这一行代码,那么Call _snprintf_s function时就会崩溃。因为已经将多余的内存空间delete掉了,只留下strlen(p) + 1那么大的内存,装不下更多的数据。
    这句代码的意思是,在原有内存的基础上把多余的内存delete掉,只留下strlen(p) + 1 这么多的内存

    典型错误
     1 int main()
     2 {
     3     char array[10]{0};
     4     strcpy_s(array, 10, "Hello"); 7     // char *parray = (char *)realloc(array, 50);17     getchar();
    18     return 0;
    19 }
    array在栈区,而realloc是在堆区分配内存。栈跟堆,永远也打不到一块去
  • 相关阅读:
    npm install 错误 | gyp ERR! configure error
    AD中鼠标经过PCB走线或元器不能高亮显示连线的解决办法
    浏览器提示TLS版本过低, 要求升到TLS1.2或TLS1.3的一些问题收录
    Java.报错:The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    Centos.安装Goaccess1.2
    Mongoose多数据库连接及实用样例
    mongodb通过profile来监控数据
    mongodb副本集 statestr状态说明/解释
    mongodb.副本集配置方法(使用keyfile认证部署)
    vsftp安装与配置for Linux
  • 原文地址:https://www.cnblogs.com/LandyTan/p/6408696.html
Copyright © 2020-2023  润新知