考虑一个指针数据类型,例如一个浮动指针数字。
typedef float* flPtrt;
如何在本地作用域中分配一个由3个元素组成的数组?我想在同一范围内使用malloc
和free
会产生开销,但有什么替代方案呢?
void foo() {
flPtrt ptr = malloc(sizeof(float)*3);
// ...
free(ptr);
}
如果3
在编译时已知并且足够小,则可以声明一个本地数组并将其用作指针
void foo() {
float array[3];
flPtrt ptr = array;
}
如果大小更大或可变,则必须像示例中那样使用动态内存。
我想您想要的是alloca()
函数。我不确定它是标准C,但它存在于GNU中,它在我的视觉工作室中工作过。这就是你使用它的方式:
int n = 5;
int* a = (int*) alloca(sizeof(int) * n);
它在堆栈上创建一个元素数组(而不是在带有malloc的堆上)。优点:开销更少,无需手动释放(当您从方法返回时,堆栈会折叠回来,内存也会丢失)缺点:如果你想从一个方法返回一个指针,千万不要使用alloca,因为在退出函数后,你将指向不再存在的东西。也可以说堆栈通常比堆小,所以如果您想要更大的空间,请使用malloc。点击此处查看更多信息
如果提前知道所需的数组大小,可以将其分配为堆栈变量,避免堆内存管理。
否则,您概述的方法是合适的,实际上没有其他选择。
使用数组。
void foo(void) // note that "void foo()" is obsolete
{
float data[3];
float *ptr = data;
// ...
}