2017-06-02 8 views
1

のは、私はこのような構造体を持っているとしましょう:文字列に構造体のエントリを渡すと、その逆

typedef struct { 
    unsigned s_i, s_j; 
    unsigned d_i, d_j; 
} obs_t 

私は、関数を定義したい:例えば、

obs_t * string_to_struct (char * s); 

フォーマットされた文字列を読み込み、 "1 1 4 6"のようにして、4つの数値をstruct obs_tに渡します。

obstacle_t * string_to_obstacle (char * s){ 
obstacle_t *ostacolo = malloc(sizeof(obstacle_t)); 
unsigned int **format; 
sscanf(s, "%u %u %u %u", format[0], format[1], format[2], format[3]); 
ostacolo -> s_i = *format[0]; 
ostacolo -> s_j = *format[1]; 
ostacolo -> d_i = *format[2]; 
ostacolo -> d_j = *format[3]; 
} 
+2

変数 'format'はポインタです。しかしそれはどこを指していますか? –

答えて

3

あなたはポインタ値に形式を初期化することはありませんので、indeterminate値を持っており、それが未定義の動作をしている逆参照:これまでのところ私は、セグメンテーションフォールトを回避することができませんでした、私は次のコードを使用しています。 intへのポインタへのポインタでは、intに4つのポインタのためのスペースを割り当て、のフォーマットをポイントしてから、4つの整数のためのスペースを割り当て、それらを指すポインタを設定する必要があります。

また、sscanfが失敗した場合、NULLポインタの逆参照、または指定されていない値をostacoloのフィールドに代入/残している可能性があるので、mallocおよびsscanfの戻り値もチェックしないでください。また、void以外の関数にreturn文もありません。

ここでは、これらの問題に対処string_to_obstacleのバージョンがあります:

obstacle_t * string_to_obstacle (char * s) 
{ 
     obstacle_t *ostacolo = malloc(sizeof *ostacolo); 

     if (!ostacolo) { 
       return NULL; 
     } 

     if (sscanf(s, "%u %u %u %u", &ostacolo->s_i, &ostacolo->s_j, &ostacolo->d_i, &ostacolo->d_j) < 4) { 
       free(ostacolo); 
       return NULL; 
     } 

     return ostacolo; 
} 

それはsscanf関数は、文字列の符号なし整数にフィットよりも大きな整数を渡して処理する方法がない心に留めておくために良いことです。 The behavior is undefined

関連する問題