2013-02-25 4 views
1

У меня есть-структура:Передача массива структуры функционировать изменения размера массива

struct Thing { 
    int id; 
} 

Затем я создаю массив Thing с:

struct Thing *a; 
a = (struct Thing *) malloc(sizeof(struct Thing)); 
a->id = 1; 

struct Thing *b; 
b = (struct Thing *) malloc(sizeof(struct Thing)); 
b->id = 2; 

struct Thing *array[] = {a,b}; 

проверить размер массива и равно 2. проверить размер массива по:

printf("%d",sizeof(array)/sizeof(array[0])); 

у меня также есть функции, которые принимают s в массиве вещей:

void function(struct Thing *array[]) { 
    //do stuff 
} 

Тогда я прохожу в массиве функционировать:

function(array); 

Внутри функции, размер массива равен 1. Может кто-то точка мне, где сделал Я ошибаюсь и почему размер массива 1 внутри функции?

+0

, пожалуйста, прочитайте C FAQ http://www.c-faq.com/aryptr/index.html –

+0

или [что такое разложение массива?] (Http://stackoverflow.com/q/1461432) –

+0

@ KarthikT Я нашел решение от ZhangYuan в комментарии ниже. – drum

ответ

2

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

void function(struct Thing *array[]) { 
    //do stuff 
} 

ли просто синтаксический сахар для

void function(struct Thing** array) { 
    //do stuff 
} 
+0

Это объясняет, почему остается только 1-й элемент. – drum

+0

@drum, оба элемента все еще существуют, второй элемент можно получить как 'array [1]'. Просто тип данных изменился с массива на указатель и, следовательно, на поведение 'sizeof' с ним. –

+0

Нет, оба элемента остаются, но указатель указывает только на начало массива! Вы должны иметь доступ ко второму индексу в funtion без SEGFAULT. –

1

Ваш массив четкостью

struct Thing *array[] = {a,b}; 

должен быть

struct Thing array[] = {a,b}; 

затем передать его функции; функция должна быть объявлена ​​

void function(struct Thing *array, int count) { 
//do stuff 
} 

, чтобы вы могли пройти границы массива.

+2

'a' и' b' являются указателями на структуру, и вы предлагаете инициализировать массив структур с указателями на структуры, как это будет работать? –

+1

'struct Thing array [] = {* a, * b}'; – yuan

+0

@ ZhangYuan: Спасибо! Это было именно решение моей проблемы! Вы должны отправить ответ, и я приму его. – drum

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