2010-07-12 36 views
5

Ho cercato di farlo funzionare per alcune ore, ma non riesco a capirlo.Restituisce array di stringhe

Sto provando a scrivere una funzione in grado di restituire un array di stringhe.

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

Sono probabilmente si mescolino con i puntatori da qualche parte, perché ho il seguente output:

ciao
Segmentation Fault

+2

Non è necessario '\ 0' alla fine di una stringa. Quando usi le virgolette doppie, il compilatore aggiunge il carattere '\ 0' per te. Hai solo bisogno del '\ 0 'se si dichiara le corde come' char Ciao [] = { 'h', 'e', ​​'L', 'L', 'o', '\ 0'}; ' –

+1

I so che sono una seccatura, ma per favore liberate ciò che avete malloc'd. È una buona pratica e se lo fai sempre mentre scrivi il codice ti dimenticherai meno spesso. – Daniel

+0

Sapevo che non avevo bisogno del terminatore null, ma ha incluso, per qualche ragione, grazie per la segnalazione. Grazie Dan, di solito lo faccio, ma questo era solo un test. Grazie. – Kewley

risposta

10

Sì, avete ottenuto il vostro indirections puntatore mescolati, i membri della schiera di dati deve essere impostato in questo modo:

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

Nella funzione, Datapunti in una matrice, non è una matrice stessa.

Un'altra nota: non è necessario inserire i caratteri espliciti \0 nei valori letterali stringa, vengono annullati automaticamente.

+0

ho provato che in origine e non riuscivo a capire il motivo per cui non ha funzionato, ma l'ho fatto senza le parentesi. Molte grazie!! :) – Kewley

Problemi correlati