2017-01-07 111 views
0

我有一個由char*和許多屬性組成的結構。C程序,printf char *崩潰

我無法打印我的char*作爲字符串,它只是崩潰。

這裏是我的代碼:

int main() { 
    sommet_t* sommet = creerSommet("rouge", 5, NULL); 
    printf("Couleur : %s", sommet->couleur); 
    return 0; 
} 

而且我sommet.c:

sommet_t* creerSommet(char* couleur, int distance, sommet_t* pere) { 
    sommet_t* sommet = malloc(sizeof(sommet_t)); 
    sommet->distance = distance; 
    sommet->couleur = (char*)malloc((strlen(couleur)+1) * sizeof(char)); 
    strcpy(sommet->couleur,couleur); 
    sommet->pere = pere; 
} 

我絕對不知道什麼是錯的。

編輯:sommet.h

#ifndef __SOMMET_H__ 
#define __SOMMET_H__ 

typedef struct sommet_type { 
    char *couleur; 
    int distance; 
    struct sommet_type *pere; 
} sommet_t; 

sommet_t* creerSommet(char*, int, sommet_t*); 

#endif 
+0

新增返回對象在後 –

+1

'的sizeof(char)的''中(的char *)malloc的((strlen的(傳送彩色)+1)*的sizeof (char));'是多餘的和不必要的。 –

+1

[請參閱此討論,爲什麼不在'C'中投射'malloc()'和家族的返回值。](http://stackoverflow.com/q/605845/2173917)。 –

回答

1

你忘了從函數返回sommet

FWIW,任何函數,如果不是return的值,並且返回值用於調用者,則調用undefined behavior,該函數有望返回某個值。

引用C11,章§6.9.1,函數定義

如果終止達到功能和函數調用的值由 使用呼叫者的},行爲未定義。

這就是說,

+0

噢,就是這樣,我沒有在IDE或編譯器中出現錯誤,需要使用該語言注意更多:( –

+0

它仍然崩潰tho:x –

+2

啓用警告......或者使用合適的編譯器,這個問題很容易被發現, –

3

你應該從功能creerSommet

sommet_t* creerSommet(char* couleur, int distance, sommet_t* pere) { 
    sommet_t* sommet = malloc(sizeof(sommet_t)); 
    sommet->distance = distance; 
    sommet->couleur = (char*)malloc((strlen(couleur)+1) * sizeof(char)); 
    strcpy(sommet->couleur,couleur); 
    sommet->pere = pere; 
    return sommet; 
} 
+0

謝謝,我添加了它,但是它仍然崩潰 –

+0

sommet-> couleur =(char *)malloc((strlen(couleur)+1)* sizeof(char));是不是隻爲一個角色分配空間,因爲coleur在這個階段未初始化,或者更糟的是,可能是一些垃圾數據的長度? – synchronizer

+0

@synchronizer'coleur'指向''rouge'',對嗎? –