函数:
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是在堆区分配内存。栈跟堆,永远也打不到一块去
来源:https://www.cnblogs.com/LandyTan/p/6408696.html