Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用静态变量分割故障

使用静态变量分割故障
EN

Stack Overflow用户
提问于 2016-05-04 22:24:59
回答 3查看 1.4K关注 0票数 0
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <pwd.h>
#include <stdio.h>

struct passwd* Getpwnam_(const char* name)
{
        static struct passwd* passwd;

        while((passwd=getpwent())!=NULL)        /* get pw entry line by line */
        {
                if(strcmp(passwd->pw_name, name)==0)    /* find the same name */
                        return passwd;
        }

        if(passwd==NULL)        /* there is no matching name */
                return NULL;
}

int
main(void)
{
        printf("%ld %ld\n", (long)(Getpwnam_("root")->pw_uid), (long)(Getpwnam_("cho")->pw_uid));
}

在上面的代码中,当我使用以下主要函数时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
printf("%ld\n", (long)(Getpwnam_("root")->pw_uid));
printf("%ld\n", (long)(Getpwnam_("cho")->pw_uid));

它运转良好。但是,当我使用一个带有两个printf()Getpwnam_()作为参数时,我会得到一个分段错误。我认为我的代码操作没有问题。

但是,为什么这会给我一个分割错误呢??

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-04 22:34:04

您需要在调用setpwent()之间用Getpwnam_()回滚密码数据库。

假设您的应用程序首先调用Getpwnam_("cho")。如果在数据库中,"root""cho"之前,那么在搜索中,getpwent()将返回"root",但是您的搜索将丢弃它,因为它与"cho"不同。稍后,getpwent()将返回"cho",这是有效的结果。

如果您的应用程序接下来调用Getpwnam_("root"),那么getpwent()将开始从上次调用中返回条目,这一点在数据库中超出了"root""cho"。由于"root"将不再返回,搜索将不会得到结果,您将得到一个空指针,它会使程序崩溃。

票数 2
EN

Stack Overflow用户

发布于 2016-05-04 22:36:15

一个问题是,您试图同时保存两个密码条目。随后对getpwent的调用可能会覆盖先前返回的信息。因此,在再次调用getpwent之前,您需要完成返回的信息处理。如果需要,请复制所需的字段。

此外,没有必要声明指针是静态的,因为您没有返回它的地址。

( atturri提到的另一个问题是,在调用之间,您没有返回到带有setpwent的密码的开头。如果代码在尝试引用密码字段之前检查了NULL返回,这可能会更清楚。)

票数 3
EN

Stack Overflow用户

发布于 2016-05-04 22:33:49

这里的问题很可能与getpwent返回指向它管理的(可能是静态)内存区域的指针有关。因此,基本上,当您获得返回值时,您必须在再次调用getpwent之前使用它。因为第二次呼叫可以覆盖甚至释放由上一次呼叫返回的区域。

从手册页:

返回值可以指向一个静态区域,并且可以被随后对getpwuid()、getpwnam(3)或getpwuid(3)的调用覆盖。(不要传递返回到空闲(3)的指针。)

所以两个单独的打印可以工作,因为你使用第一个之前的第二个电话。但是,将两者放在相同的打印中意味着第二个调用将使第一个调用返回的指针无效,但是print则尝试使用这两种类型的指针。即使您没有得到一个seg错误,它也很可能不会为第一个用户产生正确的输出。

相反,您需要更改Getpwnam_,将需要的数据复制到新分配的对象中,并返回指向该对象的指针。注意:如果您也需要一些字符串,则复制将需要“递归”。

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

https://stackoverflow.com/questions/37043815

复制
相关文章
完美解决PHP使用curl返回空白
最新的curl认可证书:https://curl.haxx.se/ca/cacert.pem
房东的狗丶
2023/02/17
3.4K0
从列表中或数组中随机抽取固定数量的元素组成新的数组或列表
2:jQuery版本 那么jQuery中怎么随机选出固定数组数组[1, 2, 3, 4, 5, 6, 7, 8, 9]中的三个元素,并构造成新数组的?
王小婷
2018/08/02
6.1K0
Android列表组件ListView使用详解之动态加载或修改列表数据
在使用ListView组件来显示列表数据时,有的时候我们需要改变列表中的数据,有以下方法:
PHP开发工程师
2021/06/09
1.3K0
3-4 文件读写例子(4)
/*******************************************************
py3study
2020/01/14
3620
迷途知返的滴滴
从美股退市,对于滴滴来讲,或许是再适合不过的事情了。对于滴滴来讲,这更像是一次迷途知返。在中概股回港上市的大潮流里,纵然是滴滴不再这样一个时间档口选择从美股退市,在未来的某一个时间点上,滴滴还是要选择从美股退市的。所以,滴滴选择在这样一个时刻从美股退市,更多地是在做未来必然要做的事情。
孟永辉
2022/05/25
3190
迷途知返的滴滴
Django Model 如何返回空的 QuerySet
>>> from django.contrib.auth.models import User >>> User.objects.none() <QuerySet []> 以上就是本文的全部内容,如果觉得还不错的话。
AlwaysBeta
2022/05/05
7640
【解决】librosa.load MP3返回空 或 报错Input signal length=0 is too small to resample from
        用pydub.utils.mediainfo()去分析,可以发现,它对音频start_time=0的音频都会报这个错,而start_time != 0的就可以正确加载。
小锋学长生活大爆炸
2023/03/01
9760
【解决】librosa.load MP3返回空 或 报错Input signal length=0 is too small to resample from
python中星号的意义(**字典,*列表或元组)
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*、** 。 调用函数时使用* ,** test(*args)中 * 的作用:其实就是把序列 args 中的每个元素,当作位置参数传进去。比如上面这个代码,如果 args 等于 (1,2,3) ,那么这个代码就等价于 test(1, 2, 3) 。 test(**kwargs)中** 的作用:则是把字典 kwargs 变成关键字参数传递。比如上面这个代码,如果 kwargs 等于 {
用户1214487
2018/01/24
3.7K0
文件方法
C# 获取指定目录下所有文件信息、移动目录、拷贝目录 /// <summary> /// 获取目录下的所有文件夹和文件的path /// </summary> /// <param name="path"></param> /// <returns></returns> public static List<string> getPath(string path) { Directory
用户1055830
2018/01/18
6600
访问权限导致toString返回空BUG分享
这个BUG偶然间发现的,因为之前一直都是用Groovy去写脚本(Groovy默认访问权限是public)。在某一个使用Java写脚本的时候突然发现,我将创建好的对象toString之后竟然是空的,无论是打印对象属性还是非空验证都是通过的。但是通过fastjson的toString方法之后就变成了空。
FunTester
2020/10/19
4410
win10 uwp 解决 SerialDevice.FromIdAsync 返回空
调用 SerialDevice.FromIdAsync 可能返回空,因为没有设置 package.appmanifest 可以使用端口
林德熙
2019/03/13
6330
tp自动验证流程和返回空数组的问题
今天下午上班做配置表数据自动验证更新时,发现验证失败返回false,而验证成功返回的却只是空数组,导致一直判断为false;
仙士可
2019/12/18
9940
Python 中如何向列表或数组添加元素
然而,与其它编程语言不同,数组在 Python 中不是一个内置的数据结构。Python 使用列表取代传统的数组。
Python学习者
2023/09/11
4180
实现列表瀑布流布局(纯css或js定位)
前言:最近项目好几个都怼到一起,导致好久没有更新了。这里就简单记录下这段时间常常要写的瀑布流列表 纯css实现: 直接上代码 <style lang="scss"> .post-list{/* 列表设置,2列;列间距4*/ -webkit-column-count: 2; -webkit-column-gap:16upx; padding: 30upx 16upx; .post-li{ -webkit-col
stys35
2020/06/28
2.1K0
Oracle启动失败startup – 闪回空间满
失败,ORA-03113: end-of-file on communication channel 查看日志: SQL> show parameter db_recovery_file_dest_size;
星哥玩云
2022/08/18
7050
11 - 去掉列表或元组中的重复元素
在python 中如何定义集合,集合与列表有什么区别 # 列表 a = [1, 2, 3, 4, 5] print(type(a)) # 元组 b = (1, 2, 3, 4, 5) print(type(b)) # 集合 c = {1, 2, 3, 4, 5} print(type(c)) <class 'list'> <class 'tuple'> <class 'set'> # 区别: # 1. 集合没有重复的元素,而列表可以有重复的元素 a = [1, 2, 2, 3, 4] print(a)
ruochen
2021/05/22
3.6K0
11 - 去掉列表或元组中的重复元素
CreateWindow返回空句柄而GetLastError返回0咋回事
调用CreateWindow或CreateWindowEx创建窗口返回空句柄时,我们总是会调用GetLastError看下错误码,就知道具体错误的原因(比如窗口类未注册),但如果GetLastError返回0没有报错,是怎么回事呢?
gaigai
2019/08/30
2.3K0
CPS推荐奖励历史返佣规则
2025年3月18日起,沉睡用户定义由“180天内无保有消费记录”变更为“30天内无保有消费记录”。
腾讯云-推广奖励
2022/05/24
7.5K0
Audio Unit录音(播放伴奏+耳返)
前言 相关文章: 使用VideoToolbox硬编码H.264 使用VideoToolbox硬解码H.264 使用AudioToolbox编码AAC 使用AudioToolbox播放AAC
落影
2018/04/27
3.1K0
Audio Unit录音(播放伴奏+耳返)
点击加载更多

相似问题

蓝鸟图早返

21

Mongoose填充返回空数组或ObjectIds列表

21

DirectoryInfo.getFiles以开头

36

Sqlalchemy返标

13

从Directory.GetFiles填充二维列表

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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