2013-02-25 2 views
1

J'ai un struct:Passer un tableau de struct fonction change taille du tableau

struct Thing { 
    int id; 
} 

Ensuite, je crée un tableau de Thing s:

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}; 

Je vérifie la taille du tableau et est 2. Je vérifie la taille du tableau par:

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

J'ai aussi une fonction qui prend s dans un tableau de choses:

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

Ensuite, je passe dans le tableau de fonctionner:

function(array); 

A l'intérieur de la fonction, la taille du tableau est 1. point Quelqu'un peut-il me où a Je me trompe et pourquoi est la taille du tableau 1 à l'intérieur de la fonction?

+0

s'il vous plaît lire la FAQ C http://www.c-faq.com/aryptr/index.html –

+0

ou de [ce qui est ensemble en décomposition?] (Http://stackoverflow.com/q/1461432) –

+0

@ KarthikT J'ai trouvé ma solution de ZhangYuan à un commentaire ci-dessous. – drum

Répondre

2

Lorsque vous passez un tableau de n'importe quel type à une fonction, il désintègre en un pointeur vers le premier élément de ce tableau.

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

Est-ce que le sucre syntaxique pour

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

Cela explique pourquoi seul le 1er élément reste. – drum

+0

@drum, les deux éléments sont toujours là, le 2ème élément peut être accédé comme 'array [1]'. C'est juste que le type de données a changé de tableau en pointeur, et donc le comportement de 'sizeof' avec lui. –

+0

Non, les deux éléments restent, mais le pointeur ne pointe que vers le début du tableau! Vous devriez pouvoir accéder au deuxième index dans la fonction sans SEGFAULT. –

1

Votre tableau définition

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

devrait être

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

puis passer à la fonction; la fonction doit être déclarée

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

afin que vous puissiez passer les limites du tableau.

+2

'a' et' b' sont des pointeurs vers struct et vous suggérez d'initialiser un tableau de structs avec des pointeurs sur les structures, comment cela va-t-il fonctionner? –

+1

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

+0

@ZhangYuan: Merci! C'était exactement la solution à mon problème! Vous devriez poster la réponse et je l'accepterai. – drum