2017-01-07 5 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 *)はmalloc((strlenを(クルール)で+1)*はsizeof (char)); 'は冗長で不要です。 –

+1

['malloc()'と 'C 'のファミリの戻り値をキャストしない理由についてのこのディスカッションを参照してください。](http://stackoverflow.com/q/605845/2173917)。 –

答えて

1

あなたが関数からsommetを返すのを忘れていました。

FWIW、値がreturnで、戻り値が呼び出し側で使用されていない場合は、何らかの値を返すと予想される関数はundefined behaviorを呼び出します。機能を終了}に到達すると、関数呼び出しの値は 呼び出し側で使用され、動作がある場合はC11、章§6.9.1を引用

は、機能は

を画成未定義。言っ

  • Please see this discussion on why not to cast the return value of malloc() and family in C.
    • は必ず返されたポインタを使用する前に、 malloc()の成功のために確認してください。
    • sizeof(char)は、Cでは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'は' 'ルージュ ''を指していますよね? –

    関連する問題