Как локально разместить массив-указатель в C? - PullRequest
1 голос
/ 03 февраля 2012

Представьте себе тип данных указателя, например, число с плавающим указателем.

typedef float* flPtrt;

Как бы я выделил массив из 3 элементов в локальной области видимости? Я предполагаю, что использование malloc и free в одной и той же области приводит к накладным расходам, но какова альтернатива?

void foo() {
    flPtrt ptr = malloc(sizeof(float)*3);
    // ...
    free(ptr);
}

Ответы [ 4 ]

2 голосов
/ 03 февраля 2012

Если 3 известно во время компиляции и достаточно мало, вы можете объявить локальный массив и использовать его в качестве указателя

void foo() {
    float array[3];
    flPtrt ptr = array;
}

Если размер больше или переменный, вы должны использовать динамическую память, как в вашем примере.

1 голос
/ 03 февраля 2012

Я думаю, что вы ищете функцию alloca().Я не уверен, что это стандартный C, но он существует в GNU, и он работал в моей визуальной студии.Вот как вы его используете:

int n = 5;
int* a = (int*) alloca(sizeof(int) * n);

Создает массив элементов в стеке (а не в куче с malloc).Преимущества: меньше накладных расходов, нет необходимости освобождать вручную (когда вы возвращаетесь из вашего метода, стек сбрасывается и память теряется) Недостаток: если вы хотите вернуть указатель из метода, НИКОГДА не используйте alloca, так как вы будете указыватьто, что больше не существует после выхода из функции.Можно также утверждать, что стек обычно меньше кучи, поэтому, если вы хотите больше места, используйте malloc.Подробнее здесь

1 голос
/ 03 февраля 2012

Использовать массив.

void foo(void) // note that "void foo()" is obsolete
{
    float data[3];
    float *ptr = data;
    // ...
}
1 голос
/ 03 февраля 2012

Если вы заранее знаете требуемый размер массива, вы можете просто выделить его как переменную стека и избежать управления кучей памяти.

В противном случае изложенный вами подход является подходящим, а на самом деле его нетальтернатива.

...