2010-10-25 14 views
0

Supposons que je le code suivant:Accès/modification d'un tableau de chaînes dans une structure

typedef struct 
{ 
    char **p; 
} STRUCT; 

int main() 
{ 
    STRUCT s; 
    *(s.p) = "hello"; 
    printf("%s\n", *(s.p)); 

    return 0; 
} 

qui ne fonctionne évidemment pas, mais il doit montrer ce que je veux faire. Comment procéder pour initialiser, accéder, imprimer, etc. le tableau de chaînes dans la structure?

Répondre

3

Vous avez deux * où vous voulez juste un, je pense. Essayez:

typedef struct 
{ 
    char *p; 
} STRUCT; 

int main() 
{ 
    STRUCT s; 
    s.p = "hello"; 
    printf("%s\n", s.p); 

    return 0; 
} 

Si vous faites voulez vraiment avoir la double indirection, vous devez allouer un espace pour le pointeur vous déréférencement. *(s.p) dans votre programme d'origine déréférences un pointeur non initialisé. Dans ce cas:

typedef struct 
{ 
    char **p; 
} STRUCT; 

int main() 
{ 
    STRUCT s; 
    s.p = malloc(sizeof(char *)); 
    *(s.p) = "hello"; 
    printf("%s\n", *(s.p)); 
    free(s.p); 
    return 0; 
} 

Ce deuxième programme alloue de l'espace pour un seul pointeur de chaîne; Si vous voulez un tableau, allouez juste la quantité d'espace appropriée.

2

Il n'y a pas de tableau pour l'instant, mais je suppose que vous voulez en créer un. Vous devez d'abord allouer autant char * s que vous voulez cordes:

int main() 
{ 
    STRUCT s; 
    int N = 10; // number of strings you want 
    s.p = (char **)malloc(N * sizeof(char *)); 
    s.p[0] = "hello"; 
    s.p[1] = "world"; 
    ... 
    printf("%s\n", s.p[0]); 
    free(s.p); 

    return 0; 
} 
+0

Hmmm, mais un pointeur peut pas être considéré comme un tableau aussi bien? c'est à dire. avec 'char ** p', le premier pointeur pointe vers une chaîne et le second pointe vers les caractères de la chaîne. – jon2512chua

+0

@ jon2512chua: Un tableau peut être considéré comme un pointeur, et non l'inverse. Vous ne pouvez pas stocker quoi que ce soit en utilisant un pointeur sauf si vous lui allouez de l'espace ou si vous le faites pointer vers une variable/tableau existante. – casablanca

+0

Ok, merci. – jon2512chua

0

Vous allez avoir besoin de savoir combien de chaînes sont contenues dans le tableau, soit en ajoutant un membre de comptage à la struct ou en utilisant une valeur sentinelle NULL. Les exemples suivants utilisent la sentinelle NULL:

Allouer et initialiser:

STRUCT s; 
s.p = malloc(sizeof *s.p * (number_of_strings + 1)); 
if (s.p) 
{ 
    size_t i; 
    for (i = 0; i < number_of_strings; i++) 
    { 
    s.p[i] = malloc(length_of_ith_string + 1); 
    if (s.p[i]) 
     strcpy(s.p[i], ith_string); 
    } 
    s.p[i] = NULL; 
} 

pour les valeurs appropriées de number_of_strings, length_of_ith_string et ith_string.

Accès/impression:

for (i = 0; s.p[i] != NULL; i++) 
    printf("String %d: %s\n", i, s.p[i]); 

Désallocation:

for (i = 0; s.[i] != NULL; i++) 
    free(s.p[i]); 
free(s.p);