2010-07-12 10 views
5

J'ai essayé de faire fonctionner cela pendant quelques heures maintenant, mais je n'arrive pas à comprendre. J'essaye d'écrire une fonction qui est capable de retourner un tableau de chaînes.Retour tableau de chaînes

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

/** 
* This is just a test, error checking ommited 
*/ 

int FillArray(char *** Data); 

int main() 
{ 
    char ** Data; //will hold the array 

    //build array 
    FillArray(&Data); 

    //output to test if it worked 
    printf("%s\n", Data[0]); 
    printf("%s\n", Data[1]); 

    return EXIT_SUCCESS; 
} 


int FillArray(char *** Data) 
{ 
    //allocate enough for 2 indices 
    *Data = malloc(sizeof(char*) * 2); 

    //strings that will be stored 
    char * Hello = "hello\0"; 
    char * Goodbye = "goodbye\0"; 

    //fill the array 
    Data[0] = &Hello; 
    Data[1] = &Goodbye; 

    return EXIT_SUCCESS; 
} 

Je suis probablement se mélanger avec les pointeurs quelque part parce que je reçois la sortie suivante:

bonjour
Segmentation Fault

+2

Vous n'avez pas besoin de '\ 0 'à la fin d'une chaîne. Lorsque vous utilisez les guillemets doubles, le compilateur ajoute le caractère '\ 0' pour vous. Vous avez seulement besoin de '\ 0' si vous déclarez vos chaînes comme' Bonjour Bonjour [] = {'h', 'e', ​​'l', 'l', 'o', '\ 0'}; ' –

+1

I sache que je suis une nuisance mais s'il vous plaît libérez ce que vous avez malloc'd. C'est une bonne pratique et si vous le faites toujours pendant que vous écrivez du code, vous en oubliez moins souvent. – Daniel

+0

Je savais que je n'avais pas besoin du terminateur null mais je l'ai inclus pour une raison quelconque, merci d'avoir signalé cela. Merci Dan, d'habitude, mais c'était juste un test. Merci. – Kewley

Répondre

10

Oui, vous avez obtenu votre indirections pointeur embrouillée, les membres du tableau de données doit être défini comme ceci:

(*Data)[0] = Hello; 
(*Data)[1] = Goodbye; 

Dans la fonction, Datapoints à un tableau, ce n'est pas un tableau lui-même.

Autre remarque: Vous n'avez pas besoin de mettre explicitement \0 caractères dans vos littéraux de chaîne, ils sont automatiquement fermés par zéro.

+0

J'ai essayé cela à l'origine et je ne pouvais pas comprendre pourquoi cela ne fonctionnait pas, mais je l'ai fait sans les crochets. Merci beaucoup!! :) – Kewley