想一下指针数据类型,例如浮点指针数。
typedef float* flPtrt;
如何在本地范围内分配3个元素的数组?我想使用malloc
和free
使用相同的范围会产生开销,但还有什么选择呢?
void foo() {
flPtrt ptr = malloc(sizeof(float)*3);
// ...
free(ptr);
}
答案 0 :(得分:2)
如果3
在编译时已知并且足够小,则可以声明一个本地数组并将其用作指针
void foo() {
float array[3];
flPtrt ptr = array;
}
如果尺寸较大或可变,则必须使用动态记忆,如示例所示。
答案 1 :(得分:1)
如果您提前知道所需的数组大小,则可以将其分配为堆栈变量并避免堆内存管理。
否则,您概述的方法是合适的,并没有其他选择。
答案 2 :(得分:1)
使用数组。
void foo(void) // note that "void foo()" is obsolete
{
float data[3];
float *ptr = data;
// ...
}
答案 3 :(得分:1)
我认为你所寻找的是alloca()
功能。
我不确定它是标准的C,但它存在于GNU中,它在我的视觉工作室中运行。
所以这就是你如何使用它:
int n = 5;
int* a = (int*) alloca(sizeof(int) * n);
它在堆栈上创建一个元素数组(而不是在具有malloc的堆上)。 优点:开销更少,无需手动释放(当您从方法返回时,堆栈折回并且内存丢失) 缺点:如果你想从一个方法返回一个指针从不使用alloca,因为你将指向退出函数后不再存在的东西。人们还可以争辩说堆栈通常比堆小,所以如果你想要更大的空间使用malloc。 查看更多here