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[])
- {
-
- int stackArray[10]={1,2,3,4,5,6,7,8,9,10};
- int i;
- int j;
- int *p;
-
- 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;
- p = (int *) alloca(sizeof(int) * 12);
-
-
- stackArray[10] = 99;
- stackArray[11] = 100;
-
- 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】