具有结构行为的段错误

时间:2014-03-20 21:33:30

标签: c struct segmentation-fault

我目前有一个用于存储端口和目标地址信息的结构,我想用一个简单的文本文件读取数据。

typedef struct {
    int listen_port;
    int forward_port;
    char *forward_addr;
} Route;

如果我只指定30就可以了。

E.G。

while((read = getline(&line, &length, f)) != -1) {
    Route *srv = (Route*) malloc(sizeof(Route));
    srv->listen_port = 30;  //works fine
    /* rest of code */
}

但是,如果我尝试使用strtok来标记从文件80,127.0.0.1,8080读取的行,然后将其分配给srv->listen_port,则会出现seg错误。

E.G。

while((read = getline(&line, &length, f)) != -1) {
    int port = atoi(strtok(line, ","));
    Route *srv = (Route*) malloc(sizeof(Route));
    srv->listen_port = port;  //seg fault
    /* unreachable code */
}

有人可以解释为什么会这样吗?我很难过为什么它不起作用。

提前致谢。

1 个答案:

答案 0 :(得分:3)

atoi — how to identify the difference between zero and error?

此外,如果line是一个零长度的字符串,strtok只能返回NULL,所以可能有atoi(NULL)

此代码的行为可能未定义......

1)将行初始化为NULL,getline会为你分配空间(如果它不是NULL,它会假设你已经分配了它)

2)使用后自由行

3)使用strtol或scanf来获取整数,因为你和编译器不能确定输入行是否包含ascii数字中的数字

4)检查malloc的返回值,如果失败则返回NULL

作为一般规则,处理每个可能的错误情况,这是C

中必要的最佳实践