2017-06-02 81 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」並將四個數字傳遞給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個整數分配空間並設置指向這些指針的指針。

您也不檢查malloc和sscanf的返回值,因此如果sscanf失敗,您可能會取消引用NULL指針,或將未指定的值分配給ostacolo的字段。您的非無效函數中也沒有返回語句。

這裏的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

相關問題