首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >连续使用getline会导致分割错误

连续使用getline会导致分割错误
EN

Stack Overflow用户
提问于 2020-10-04 03:54:59
回答 1查看 347关注 0票数 1

我试图使用getline从stdin读取两行连续的输入。这个最小的代码会导致分段错误,我不知道为什么:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main() {
    char *ln1 = NULL;
    char *ln2 = NULL;
    size_t lnsz1;
    size_t lnsz2;

    getline(&ln1,&lnsz1,stdin);
    getline(&ln2,&lnsz2,stdin);


}

有人能解释我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-04 15:06:19

我在评论中说过,将大小设置为零(以及指向空指针的指针)应该修复观察到的崩溃。

隐藏在背景中的是一个假设,即导致崩溃的getline()的具体实现有些错误。如果在分配空间时使用size参数,因为指针为null,则可能会出现错误。这在某种程度上是不可能的,但问题并没有给出哪个平台会导致崩溃的信息。

getline()的POSIX规范规定:

ssize_t getline(char **restrict lineptr, size_t *restrict n, FILE *restrict stream); … 应用程序应确保*lineptr是可以传递给free()函数的有效参数。如果*n为非零,则应用程序应确保*lineptr要么指向大小至少为*n字节的对象,要么为空指针。 如果*lineptr是空指针,或者*lineptr指向的对象大小不足,则应像由malloc()分配对象或重新分配对象一样,分别由realloc()重新分配对象,使对象足够大以容纳要写入的字符,包括终止NUL,*n应设置为新的大小。如果分配了对象,或者重新分配操作移动了对象,则将更新*lineptr以指向新对象或新位置。 … 成功完成后,getline()getdelim()函数将返回写入缓冲区的字节数,如果在EOF之前遇到一个分隔符字符,则包括分隔符字符,但不包括终止NUL字符。如果设置了流的文件结束指示符,或者没有读取字符,并且流位于文件末尾,则应设置流的文件结束指示符,并返回-1。如果发生错误,将设置流的错误指示符,函数将返回-1并设置errno以指示错误。

问题中的代码并不是不言而喻地滥用了这些规则。应用程序确保*lineptr是一个空指针--这是一个可以传递给free()的值。*n的值是什么并不重要,因为*lineptr是一个空指针。

实验的一种方法是尝试在未初始化的变量(lnsz1lnsz2)中打印值,但这种实验可以说是在调用未定义的行为。另一种方法是将变量初始化为一些大值--例如SIZE_MAXSIZE_MAX / 2 (其中SIZE_MAX在C11 中定义,而不是在C标准的早期版本中定义)或其他类似的充气值。当然,您还应该使用0的值进行测试,一些测试可以使用其他小值进行,比如1816等。所有这些测试都是在指针设置为空指针的情况下进行的。如果可以使用内存分配包来调用malloc() (或realloc())的调试版本,则可以记录请求的内存大小。如果第二次调用发生崩溃,则在第一次调用getline()后打印getline()值可能会获得一些信息。

然而,这样的调查几乎不值得这么做。将指针和大小设置为零应该可以解决这个问题。如果没有,还有更多的事情要调查。然而,这不太可能是问题所在。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//#define _XOPEN_SOURCE 700 // Explicitly request POSIX support
#include <stdio.h>

int main(void)
{
    char *ln1 = NULL;
    char *ln2 = NULL;
    size_t lnsz1 = 0;
    size_t lnsz2 = 0;
    ssize_t len1 = -1;
    ssize_t len2 = -1;

    if ((len1 = getline(&ln1, &lnsz1, stdin)) != -1)
    {
        printf("%zd (%zu: %p) [%s]\n", len1, lnsz1, (void *)ln1, ln1);
        if ((len2 = getline(&ln2, &lnsz2, stdin)) != -1)
            printf("%zd (%zu: %p) [%s]\n", len2, lnsz2, (void *)ln2, ln2);
    }
    free(ln1);
    free(ln2);

    return 0;
}

注意,当getline()检测到错误或文件结束时,它特别返回-1而不是EOF。在大多数系统上,这两个值是相同的,但是C标准只要求EOF是负的-它不要求它是-1。我无法确定0的返回值对getline()有效的任何情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64194282

复制
相关文章
std::getline错误
vs低版本转高版本,std::getline报错,如下 提示 error C2027: 使用了未定义类型“std::basic_istream<char,std::char_traits> 找了istream转string的其他方法,折腾了很久才发现缺少 #include <sstream> 加上就好了
sofu456
2022/03/07
5510
std::getline错误
C++的cin、getline()和cin.getline()
但是有一天你会发现你在试图读入一串含有空格的字符串的时候,cin是干不了的,没错,因为cin是读不了空格的。
叶茂林
2023/07/28
2030
C++的cin、getline()和cin.getline()
将MapperScan错误使用导致的BindingException问题
在前面的代码中,使用fluent mybatis的mapper对表进行增删改查都没有问题。 但是fluent mybatis官方也说了,自动会生成dao层代码,将dao及其实现类都生成好了。因此也想尝试下生成的代码使用的效果。 此外,由于不想建多个project来进行测试,因此对于不同的测试,都在src/main/java下面弄各种不同的包来进行区分。本次测试的package:com.dhb.gts.javacourse.week6.mysqltest目录。
冬天里的懒猫
2021/09/22
1.5K0
不能使用astyle对Linux的Kconfig和Makefile进行排版,会导致编译错误
不同人代码的排版习惯不一样。遇到自己不喜欢的格式,看起来比较麻烦。可以使用astyle对代码进行排版。 我喜欢以"otbs"格式的排版。命令如下:
hankfu
2023/10/16
2330
错误的产品尺码数据分析会导致库存灾难
服饰零售企业向工厂、批发商、品牌商订货的时候,每个款式必须要具体到尺码。和我们自己买衣服一样,零售商批量下单也讲究尺码合适。
wujunmin
2021/09/07
4200
错误的产品尺码数据分析会导致库存灾难
数据库使用外键会导致心脏不好?
今天看了论坛的动态,有人说数据库使用外键会导致心脏不好,然后特意百度一一下,特此记录。
Java_老男孩
2019/12/03
5350
getline();和reserve();
getline() 语法: istream &getline( char *buffer, streamsize num ); istream &getline( char *buffer, streamsize num, char delim );
Max超
2019/01/21
6070
使用ThreadLocal不当可能会导致内存泄露
基础篇已经讲解了ThreadLocal的原理,本节着重来讲解下使用ThreadLocal会导致内存泄露的原因,并讲解使用ThreadLocal导致内存泄露的案例。
加多
2018/09/06
1K0
使用ThreadLocal不当可能会导致内存泄露
659. 分割数组为连续子序列
给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个长度至少为 3 的子序列,其中每个子序列都由连续整数组成。 如果可以完成上述分割,则返回 true ;否则,返回 false 。 示例 1: 输入: [1,2,3,3,4,5] 输出: True 解释: 你可以分割出这样两个连续子序列 : 1, 2, 3 3, 4, 5 示例 2: 输入: [1,2,3,3,4,4,5,5] 输出: True 解释: 你可以分割出这样两个连续子序列 :
CaesarChang张旭
2021/06/17
4180
c++使用getline和ifstream读取文件
c++使用getline和ifstream读取文件 from:http://hi.baidu.com/bellgrade/blog/item/f8781a9a9db898b3c9eaf4bc.html
用户7886150
2021/02/16
2.3K0
porm导致项目运行错误
由于创建moduel基于原来项目之上导致porm会继承原有项目导致运行错误 解决:删除继承关系 relative
全栈程序员站长
2022/07/02
8490
porm导致项目运行错误
分析一个错误使用MemoryCache导致的BUG
这个Bug是我在项目中发现的,原因是MemoryCache使用不当造成了一个不小的Bug,虽说这个Bug很大部分人都知道,但是我觉得还是分享出来,记录一下。废话不多说,我们来看一下出错的代码(代码已经经过脱敏处理)
喵叔
2021/11/24
4060
分析一个错误使用MemoryCache导致的BUG
空指针错误导致tomcat报404错误
项目代码的异常类型为500 400 没有404错误 线上却偶尔报404错误,导致成功率低于99% 追查发现是由于一个空指针错误,未被捕获抛出指定项目异常 mark
架构师刀哥
2018/03/20
1.4K0
错误cron导致linux宕机 原
MAILTO是针对用户配置的,于是将该参数加入/var/spool/cron/internal下;
阿dai学长
2019/04/03
3.3K0
getline函数(精华版)
在我的印象中,getline函数经常出现在自己的视野里,模糊地记得它经常用来读取字符串 。但是又对它的参数不是很了解,今天又用到了getline函数,现在来细细地总结一下: 首先要明白设计getline函数的目的,其实很简单,就是从流中读取字符串。而且读取的方 式有很多,包括根据限定符,根据已读取的字符的个数。从这个函数的名称来看,它的直观 意义是从流中读取一行,但是大家不要被这表面的现象所迷惑。其实如果让我来为这个函数 去一个名字的话,或许我会取一个getString,因为它的目的本来就是从流中读取字符的
Angel_Kitty
2018/04/08
1.6K0
MySQL 使用 order by limit 分页排序会导致数据丢失和重复!
作为程序员,经常写 SQL 语句是正常不过了。然而,编写一些 SQL 语句,总会出现一些奇怪的问题。
格姗知识圈
2021/02/02
6.3K0
MySQL 使用 order by limit 分页排序会导致数据丢失和重复!
从库mysqldump会导致复制中断
ERROR NO 是1756,而且只是 Slave_SQL_Running 停了。
老叶茶馆
2020/08/31
1.6K0
会声会影X5错误
作者:matrix 被围观: 3,013 次 发布时间:2013-06-13 分类:兼容并蓄 | 无评论 »
HHTjim 部落格
2022/09/26
4290
会声会影X5错误
Java 实现将连续的日期 按照天数进行分割
目录 1 工具类 2 实现 1 工具类 public static List<Map<String,Object>> getCycleList(int cycleNum, String startTime, String endTime) throws ParseException, ParseException { System.out.println("统计的时间段为:从"+startTime+"到"+endTime); Date endParse = new
一写代码就开心
2023/02/13
1.7K0
Java 实现将连续的日期 按照天数进行分割
哪些因素会导致慢查询?
不管是开发同学还是DBA,想必大家都遇到慢查询(select,update,insert,delete 语句慢),影响业务稳定性。这里说的慢,有两个含义一是比正常的慢,有可能正常执行时间是10ms,异常的是100ms 。二是sql执行时间超过设置的慢查询标准比如500ms。
用户1278550
2019/06/03
1.3K0

相似问题

使用cin和getline会导致错误。

13

使用getline重载istream操作符>>会导致错误

10

导入wxPython会导致分割错误

12

调用memset会导致分割错误

311

指针会导致分割错误。(Qt)

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文