Есть две проблемы. Во-первых, действительно, вы запутались в указателях / массивах:
int a[4]; // this is an array of 4 integers, a is the name of the array
int *a[4]; // This is an array of 4 *pointers* to int
Итак, ваша декларация:
int **blah[4];
Определить массив из 4 указателей на массив указателей. Может быть, вы смущены следующим фактом (я знаю, что я был, когда я узнал C). Если вы объявите переменную:
int *a;
Это объявление указателя на целое число. Но если у вас есть переменная a, которая является указателем, вы получите то, на что она указывает (целое число здесь), используя * a:
*a = 1; // a is a pointer (i.e. an address), *a is the value pointed to by a.
То есть * в объявлении используется для объявления указателя, но * в выражениях используется для определения значения.
Но ваша вторая проблема не имеет ничего общего с указателем. Речь идет об управлении ресурсами (память одна, но файл, блокировки - другие). Все, что размещено в стеке, больше не существует, когда оно находится вне области видимости. В чистом C у вас действительно есть только одно решение: выделение в куче с помощью malloc и последующее освобождение. Так что вы бы сделали что-то вроде:
// foo is a struct
foo *init_foo()
{
foo* tmp;
tmp = malloc(sizeof(*tmp));
// initialize tmp
return tmp;
}
И тогда вы очистите его с помощью другой функции:
foo *a;
a = init_foo();
// do stuff
clean_foo(a);
Пример: дескриптор FILE * и fopen / fclose (помимо выделения вещей, есть некоторые вещи, связанные с ОС для обработки файла). Другое решение заключается в использовании alloca, который не является стандартным C, но поддерживается многими инструментальными цепочками.
В C ++ вы можете использовать умные указатели, которые используют, например, подсчет ссылок для управления ресурсами. Я менее знаком с C ++, и я уверен, что люди будут участвовать в этой части. Идея с подсчетом ссылок заключается в том, что он по-прежнему дает некоторые преимущества автоматических указателей (вам не нужно вызывать delete самостоятельно, что чрезвычайно подвержено ошибкам для нетривиальных проектов), но при этом он не основан исключительно на области. Один интеллектуальный указатель на основе подсчета ссылок - shared_ptr в boost.