2014-12-06 1 views
1

Я хочу создать массив указателей на функции void, выделить его память и назначить массивам адреса функции, которую я хочу, чтобы она содержалась. Заявив массив, вы можете присвоить себе элементы в виде списка в скобках, как это:Как выделить память для массива указателей функций void и назначить адреса массиву

const char *array[NUM_OF_ELEMENTS] = {"foo1", "boo2", "foo2", "boo2"}; // etc. 

Хорошо. Я объявил массив указателей на аннулированию функции, как показано ниже:

void (*pointerArray)(void) = malloc(NUM_OF_ELEMENTS * sizeof(*pointerArray)); 

Мой вопрос: Можно ли сначала объявить функцию и одновременно выделить свою память, а затем использовать «форму брекет» из назначая адреса в моем указателеArray, чтобы он фактически указывал на какую-либо функцию? Более общий вопрос: Есть ли способ сделать это быстрый способ, или я должен сделать это долгий путь, как показано здесь:

pointerArray[0] = func1; 
pointerArray[1] = func2; 
pointerArray[2] = func3; // etc. 
+0

с C вы должны сделать это «долгий путь», там» s без возможности инициализации памяти при ее динамическом распределении (кроме нуля с помощью функции 'calloc'). –

ответ

2

С NUM_OF_ELEMENTS является постоянным значением, там, кажется, не любая хорошая причина для вас передать этот массив динамически, так что вы можете также выделить его статически и инициализировать его при объявлении:

typedef void(*func_ptr)(void); 
func_ptr func_ptr_array[] = {func1,func2,func3}; 
+1

Теперь, когда я думаю об этом, динамическое распределение памяти для массива, содержащего фиксированное количество указателей и нигде не изменяющееся в коде, не имеет никакого смысла ... Я настолько тупой, спасибо за ваш ответ. – Blackstar

+1

@Blackstar: Я не думаю, что это глупый вопрос. Пожалуйста :) –

1

Вы можете использовать стек:

void (*p_stack[])(void) = { func1 , func2 } ; 

или в случае вам действительно нужно использовать таНос, первый выделить свой массив с таНос и другой один на стеке и скопировать:

void (*p_stack[NUM_OF_ELEMENTS])(void) = { func1 , func2 } ; 
void (**pointerArray)(void) = malloc(NUM_OF_ELEMENTS * sizeof(*pointerArray)); 
memcpy(pointerArray , p_stack , sizeof(p_stack)) ; 

инициализация выполняется на массиве p_stack, а затем с Опираясь на выделенный массив.

-1

void (*pointerArray)(void) - это объявление указателя функции. *pointerArray является функцией . Функции не имеют размеров, и вы не можете их выделить, и нет такой вещи, как массив функций, и вы не можете назначать или копировать функции.

Что вам нужно, это массив указателей на функции. Для того, чтобы сделать вещи проще давайте фиксировать его с ЬурейиМ:

typedef void vfun(void); 
typedef vfun* vfunp; 

vfunp* pointerArray = malloc (NUM_OF_ELEMENTS * sizeof(vfunp)); 

pointerArray[0] = func1; 
pointerArray[1] = func2; 
pointerArray[2] = func3; // etc. 

Или вы можете иметь статический выделяемый массив, если вы хотите:

vfunp pointerArray[] = { func1, func2, func3 }; 
+0

При использовании malloc '(* pointerArray) (void)' становится массивом, когда я выделяю NUM_OF_ELEMENTS, блокирует каждый размер 'sizeof (* pointerArray)'. В противном случае я мог бы просто написать 'void (* pointerArray [NUM_OF_ELEMENTS]) (void);'. Кстати, не хранит ли указатели на функции в массиве какое-то пространство памяти? Честно говоря, я чувствую себя зеленым. – Blackstar

+0

Честно говоря, я понятия не имею, о чем вы говорите. Попробуем еще раз: 'void (* pointerArray) (void)' является указателем * на функцию *. Указатель на что-то может указывать на первый элемент массива этого. Поэтому вы хотите, чтобы 'pointerArray' указывал на массив функций, но нет массивов функций, с malloc или иначе. –

Смежные вопросы