zoukankan      html  css  js  c++  java
  • 扩展堆数组的大小

    函数:

    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是在堆区分配内存。栈跟堆,永远也打不到一块去
  • 相关阅读:
    面试题 16:反转链表
    Makefile学习之路6————通过函数增强功能
    Makefile学习之路5————变量
    Makefile学习之路3————规则的运行
    LED灯C语言的点亮方式
    LED灯汇编机器码的点亮方式
    Linux的进阶命令
    入门命令2
    shell命令解析器功能说明及入门命令1
    C++基础 — C++中的变量和三目运算符
  • 原文地址:https://www.cnblogs.com/LandyTan/p/6408696.html
Copyright © 2011-2022 走看看