2010-11-06 3 views
0

Je voudrais faire quelque chose comme:passant un tableau de pointeurs de struct comme ref en C

struct mystruct { 
    char *info; 
}; 

// here is where I'm not sure how to 
void do_something(struct mystruct **struc){ 
    int i; 
    for (i = 0; i < 10; i++){ 
     *struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct)); 
     *struc[i]->info = "foo"; 
    } 
} 
int main(int argc, char *argv[]){ 
    struct mystruct **struc; 

    struc = (struct mystruct **struc) malloc (sizeof(struct mystruct *struc) * 10); 

    dosomething(&struc); 
    // do something with struc and its new inserted values 
    return 0; 
} 

Je ne sais pas comment passer comme une référence pour que je puisse utiliser après dosomething()

Merci

+0

Cela ne devrait pas compiler. Vous passez un 'struct mystruct ***' dans une fonction qui prend un 'struct mystruct **'. Cela mis à part, quel est le problème? Toutes les valeurs devraient vous être accessibles après le retour de la fonction. – EboMike

+0

@EboMike: vous avez raison, ne compile pas, et c'est ma question, je suppose que je suis confus sur la façon de gérer correctement le *, ***. – Yoshi

+0

'void do_quelquechose (struct mystruct ** struc)' devrait prendre '*** struc' comme argument, je pense. –

Répondre

2

Ok, voici ma version corrigée. Plus précisément ...

Ligne 26: aucune raison de jeter le résultat de malloc(3), il retourne déjà un void *

Ligne 28: ne faites pas un pointeur triple indirect inutile en passant & struc, vous avez déjà l'espace alloué pour il donc il est difficile d'imaginer une raison possible de le changer. Vous voulez finalement passer la valeur de retour exacte de malloc(3) à la couche suivante.

Ligne 11: un autre casting inutile, et nous voulons vraiment changer le pointeur de la ligne à struct[i], à savoir, *struc[i] changerait ce que l'un de ces 10 conseils qui main() points attribués, mais ils n'ont pas encore été fixée. C'est le boulot ici.

Et avec ces changements ça marche assez bien ...

1 #include <stdio.h> 
2 #include <stdlib.h> 
3 
4 struct mystruct { 
5 char *info; 
6 }; 
7 
8 void do_something(struct mystruct ** struc) { 
9 int i; 
10 for (i = 0; i < 10; i++) { 
11  struc[i] = malloc(sizeof(struct mystruct)); 
12  struc[i]->info = "foo"; 
13 } 
14 } 
15 
16 void do_something_else(struct mystruct ** s) { 
17 int i; 
18 
19 for (i = 0; i < 10; ++i) 
20  printf("%2d: %s\n", i, s[i]->info); 
21 } 
22 
23 int main(int argc, char *argv[]) { 
24 struct mystruct **struc; 
25 
26 struc = malloc(sizeof(struct mystruct *) * 10); 
27 
28 do_something(struc); 
29 do_something_else(struc); 
30 return 0; 
31 } 
0

Au lieu de dosomething(&struc);, utilisez dosomething(struc);. Vous avez un struct mystruct **, et c'est ce que la fonction attend.

Au lieu de

*struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));

Utilisez

struc[i] = (struct mystruct *) malloc (sizeof (struct mystruct));

struc est un struct mystruct **, donc struc[i] s'attendre à une struct mystruct *.

0

Ne tenez pas compte de coulée malloc, puisqu'il est nul *:

http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1047673478&id=1043284351 
Questions connexes