2016-07-16 23 views
-3

char配列のポインタを引数(char ** messageErreur)として受け取る関数があります。そのポインタはメインで作成されますが、必要な場合にのみ作成されるため、メモリは割り当てられません(表示するエラーメッセージ)(ここでの選択はありません。このメソッドは変更不可能な.hファイルに由来します)。ここmallocによって作成された文字列を読み取ることができません

は、私がセグメンテーションフォールトを取得するコードです:

imageMsgErr (messageErreur, "error message"); 
printf("erreur1 P2\n"); 
printf("message erreur %s\n", *messageErreur); //**where i get the seg fault 


void imageMsgErr (char** messageErreur, char* msg){ 

    messageErreur= (char**)malloc(sizeof(char*)); 
    messageErreur[0]= (char*)malloc(sizeof (char) * 100); 

    if (*messageErreur){ 
     printf("before strcpy\n"); 
     strcpy(*messageErreur, msg); 
     printf("message erreur %s\n", *messageErreur); 
    } 
    return; 

私は同じ結果といくつかの類似したコードを試してみました:それはライン実行時にセグメンテーションフォールト:

printf("message erreur %s\n", *messageErreur); 
+0

は、なぜあなたはmalloc' 'からの戻り値をキャストしていますか? –

+0

'-g'フラグでコードをコンパイルし、' --leak-check = full'オプションでプログラム上で 'valgrind'を実行し、その出力をあなたの質問に含めます。 –

+0

あなたはおそらくこれを読むべきです:http://stackoverflow.com/questions/2838038/c-programming-malloc-inside-another-function/2838207#2838207 – jamesdlin

答えて

0

ラインを

messageErreur= (char**)malloc(sizeof(char*)); 

変更点messageErreurは、ローカルでのみ楽しいction。呼び出し元関数の対応する変数が指す場所は変更されません。

簡単に修正するには、機能を少し変更することです。

char** imageMsgErr (char* msg) 
{ 
    char** messageErreur = malloc(sizeof(char*)); 
    messageErreur[0]= malloc(sizeof (char) * 100); 

    if (*messageErreur){ 
     printf("before strcpy\n"); 
     strcpy(*messageErreur, msg); 
     printf("message erreur %s\n", *messageErreur); 
    } 
    return messageErreur; 
} 

との呼び出しを変更します。

messageErreur = imageMsgErr("error message"); 

PS

Do I cast the result of malloc?

関連する問題