gpt4 book ai didi

c - 结构行为的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:04:21 29 4
gpt4 key购买 nike

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

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

如果我只分配 30 它工作正常。

例如

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,我遇到段错误。

例如

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 */
}

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

提前致谢。

最佳答案

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 中必要的最佳实践

关于c - 结构行为的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22545595/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com