#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
        printf("%s %s\n", getpwnam("steve")->pw_name, getpwnam("root")->pw_name);
        printf("%d %d\n", getpwnam("steve")->pw_uid, getpwnam("root")->pw_uid);

        return EXIT_SUCCESS;
}
$ gcc main.c && ./a.out
steve steve
1000 0

在第8行,我们try 打印用户名Steve和Root,但它打印了steve两次.在第9行,我们try 打印Steve和Root的UID,它成功地打印了它们.

我想找出第8行奇怪行为的根本原因.

我知道getpwnam返回的指针指向静态分配的内存,而像pw_name/pw_passwd/pw_gecos/pw_dir/pw_shell这样的字段指向的内存也是静态的,这意味着这些值可以被后续调用覆盖.但仍然对这个奇怪的结果感到困惑.

这是Linux编程接口的练习8-1.添加这个,这样像我这样的人将来就可以通过搜索引擎找到这个:).而且书中的问题是错的,go here分看看修订版.

推荐答案

getpwnam函数可以返回指向静态数据的指针,因此每次调用它时,它都返回相同的指针值.因为您要多次调用此函数作为printf的参数,所以您只能看到最后一个函数调用的结果.

这里的关键点是,函数参数的求值顺序是unsequenced,这意味着不能保证首先发生getpwnam("steve")还是首先发生getpwnam("root").

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

为什么在C中设置文件的位置并写入文件,填充空字符?

可以将C变量限制为特定的读/写速度吗?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

使用双指针动态分配和初始化2D数组

每个 struct 变量在C中都有自己的命名空间吗?

我的程序在收到SIGUSR1信号以从PAUSE()继续程序时总是崩溃()

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

为什么将函数名括在括号中会禁用隐式声明?

tick.q中的Kdb+键控表语法

如何按顺序将所有CSV文件数据读入 struct 数组?

如何将另一个数组添加到集合中,特别是字符串?

C编译和运行

挥发性语义的形式化理解

即使客户端不发送数据,也会发生UNIX套接字读取

如何在Rust中处理C的longjmp情况?

使用fread()函数读取txt文件

nullptr_t 是否会 destruct 类型双关或指针转换?

C simd _m128 晶圆厂

如何在 C 中编辑 struct 体中的多个变量