2010-11-14 2 views
2

Я пытаюсь выделить и инициализировать массив внутри функции, но я не могу получить значения после возврата.выделение массива внутри функции c

Это был мой последний почти работает попытка

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int func(int **thing); 

int main() { 

int *thing; 

func(&thing); 

printf("%d %d", thing[0], thing[1]); 
} 

int func(int **thing) { 

*thing = calloc(2, sizeof(int)); 

*thing[0] = 1; 
*thing[1] = 2; 

printf("func - %d %d \n", *thing[0], *thing[1]); 
} 

но значения, напечатанные за пределами функции являются 1 и 0. Есть много документации на указатели там, но я не нашел этот конкретный случай покрыт. Какие-нибудь советы о том, что я делаю неправильно?

+2

Возможно, проблема связана с приоритетом оператора? Я бы попытался заменить все «* вещь [x]» на «(* вещь) [x]». – Bwmat

ответ

5

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

int *func(); 

int main() { 

int *thing; 

thing = func(); 

printf("%d %d", thing[0], thing[1]); 
} 

int *func() { 

int *thing; 

thing = calloc(2, sizeof(int)); 

thing[0] = 1; 
thing[1] = 2; 

printf("func - %d %d \n", thing[0], thing[1]); 

return thing; 
} 

Причина ваш код не работает из-за этого:

*thing[0] 

Благодаря приоритете операторов, вы должны использовать:

(*thing)[0] 
5

предшествуют nce of * и [] - такие, что ваши задания - *(thing[0]). Вы должны явно заключить в скобки, как (*thing)[0].

3

Внутри func(), *thing[n] эквивалентно *(thing[n]), т.е. *(*(thing + n)), т.е. индексация массивов имеет приоритет над разыменовании. Вам необходимо назначить с помощью (*thing)[n].

1

[] имеет более высокий приоритет, чем дефференциация. Используйте явный paranthesis: (*thing)[0] = 1;

0

() После использования подходящего старшинства, не забудьте изменить *thing = calloc(2, sizeof(int)); к thing = calloc(2, sizeof(*int)); и выделить память для thing элементов, так как ее элементы являются указателями на целые числа.