扩展堆数组的大小

我与影子孤独终老i 提交于 2020-03-01 20:54:59

函数:

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是在堆区分配内存。栈跟堆,永远也打不到一块去

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!