我们说我有这样的结构:
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];
}
答案 0 :(得分:3)
您永远不会初始化指针值 format ,因此它具有indeterminate值,并且取消引用它具有未定义的行为。使用指向int的指针,你必须为4指针分配空间并指向格式,然后为4个整数分配空间并设置指针指向那些指针。
您也不检查malloc和sscanf的返回值,因此如果sscanf失败,您可能要么取消引用NULL指针,要么将未指定的值分配给ostacolo的字段。你的非空函数中也没有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