2010-07-12 16 views
5

Şimdi birkaç saat çalışmayı denedim, ancak kafamı buralara çekemiyorum.Dizelerin dönüşü dizisi

Dizeleri bir dizi döndürebilen bir işlev yazmaya çalışıyorum.

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

Ben muhtemelen aşağıdaki çıktıyı almak çünkü bir yere işaretçiler ile karışmasını:

merhaba
Segmentasyon Arıza

+2

Dizenin sonunda '\ 0' gerekmez. Çift tırnak işaretleri kullandığınızda, derleyici sizin için '\ 0 'karakterini ekler. Eğer dizelerinizi "char Merhaba" [] = {'h', 'e', ​​'l', 'l', 'o', '\ 0'}; ' –

+1

Bir baş belası olduğumu biliyorum ama lütfen kötü niyetli olanı serbest bırakın. Bu iyi bir uygulamadır ve eğer siz kod yazarken her zaman yaparsanız, daha az sıklıkta unutursunuz. – Daniel

+0

Boş bir terminatöre ihtiyaç duymadığımı biliyordum ama bir sebepten dolayı bunu dahil ettim. Teşekkürler Dan, genelde yaparım, ama bu sadece bir testti. Teşekkürler. – Kewley

cevap

10

Evet, işaretçi indirections bulaştı, üyelerini fonksiyonunda

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

,: Veri dizisi, bu gibi ayarlanmalıdır arasında Bir dizi içinpuan, bir dizi kendisi değil.

Başka bir not: Dize değişmezlerine açık \0 karakterleri koymanıza gerek yoktur, bunlar otomatik olarak sonlandırılır.

+0

Orijinal olarak denedim ve neden çalışmadığını anlayamadım, ancak parantez olmadan yaptım. Çok teşekkürler!! :) – Kewley