21.2.4 改变大小
要改变栈上分配的内存大小,可以用C++(www.cppentry.com)的库函数的alloca()函数,其原型如下:
- void *alloca(size_t size);
这个函数在调用它的函数的栈空间中分配一个size字节大小的空间,当调用alloca()的函数返回或退出的时候,alloca()在栈中分配的空间被自动释放。当alloca()函数执行成功时,它将返回一个指向所分配的栈空间起始地址的指针。
【示例21-7】 在栈上实现一个动态增长的变长数组。
- #include<iostream>
- //内存管理的库函数头文件
- #include <malloc.h>
- int main(int argc, char *argv[])
- {
- //在栈上,内存为10个int字节大小的内存存储单元
- int stackArray[10]={1,2,3,4,5,6,7,8,9,10};
- int i; //在栈上
- int j; //在栈上
- int *p; //在栈上
- /*输出原来存储在栈上的数组中的10个元素 */
- std::cout << "the array before changed stack memeory: " << "\n";
- for(i=0;i<10;i++)
- {
- std::cout << stackArray[i] << "\t";
- }
- std::cout << "\n";
- p = stackArray; //指向stackArray数组在栈上的内存地址
- p = (int *) alloca(sizeof(int) * 12); //修改所
指向的stackArray数组在栈上
的内存的大小,- //增加2个int字节大小的内存存储单元。
- //此时的statckArray在栈上分
配的内存为12个int字节大小的内存存 储单元- stackArray[10] = 99; /* 新增的第11个数组元素 */
- stackArray[11] = 100; /* 新增的第12个数组元素 */
- /*输出修改内存大小后的数组中的12个元素*/
- std::cout << "the array after changed stack memory: " << "\n";
- for(j=0;j<12;j++)
- {
- std::cout << stackArray[j] << "\t";
- }
- return 0;
- }
程序执行时,显示结果如下所示。
- the array before chaged stack memory:
- 1 2 3 4 5 6 7 8 9 10
- the array after chaged stack memory:
- 1 2 3 4 5 6 7 8 10 99 100
分析:示例中,首先用语句行int stackArray[10]在栈上申请了一个10个int字节大小内存存储单元的栈数组。然后用C++(www.cppentry.com)库函数alloca()对stackArray在栈上的内存大小进行了修改,成为12个int字节大小的内存存储单元。这样增加了两个int字节大小的内存单元,从而实现了对栈数组stackArray动态地增加了两个int型的数组元素其值为99和100。
注意:用alloca()函数只能用于对栈内存的大小的修改。不能用于在堆上的操作。alloca()函数分配的内存不需要程序员来释放,它是由系统在程序或调用它的函数运行结束后自动释放。
【责任编辑:云霞 TEL:(010)68476606】
| 回书目 上一节 下一节 |