- 论坛徽章:
- 0
|
#include<stdio.h>
#include<sys/types.h>
#include<pwd.h>
#include <unistd.h>
#include <stdlib.h>
int global = 10;
int main( int argc,char *argv[])
{
struct passwd *strpwd;
strpwd=getpwuid(getuid());
printf("pwd address is %p\n",(char *)strpwd);
//printf("real user name is: %s\n", strpwd->pw_name);
strpwd=getpwuid(geteuid());
//printf("effective user name is: %s\n", strpwd->pw_name);
printf("pwd address is %p\n",strpwd);
char *p = (char *) malloc(5);
printf("heap address is %p\n",p);
printf("global: %p\n",&global);
return 0;
}
这里的一个思考是:getpwuid 是根据用户uid返回一个passwd 结构的指针,可是这个真正的结构是存放在哪里的呢?
按照平常的编程习惯,加入我们想要得到一个结构的话:我们应该自己先在主调函数中分配这样一个结构体,然后将结构体的指针交给被调函数去处理,处理完了以后,主调函数中的这个结构体内就存放了我们需要的最终数据。
可是现在getpwuid 函数是:它给你返回一个passwd 结构体的指针,可是这个结构体在哪里存放却让人不明不白。首先这个结构体肯定不可能在getpwuid 这个函数中分配,因为栈中分配的内存,函数返回时立即失效。再次,这个结构体应该也不至于是malloc 分配的,如果真是malloc分配在堆中的话,被调函数分配,难道还要主调函数去释放不成,主调函数压根就不应该关心这些。
那会不会是在全局变量中呢?或者是在内核区中?
而且unix 环境编程中这样的例子还有很多,比如读取目录项的的函数 readdir() 函数返回一个 dirent 结构体指针,可是这个结构体存放的位置,也是让人疑惑不堪。
在这个例子中:我专门用printf("%p") 将令人疑惑的结构体地址打印出来了,并且跟一个malloc 函数的返回地址,还有一个全局变量的地址做了一个比较。打印出来的地址如下所示,给大家分析作为参考。会发现两次getpwuid的返回地址都是相同的。
下面是输出:
pwd address is 0x7f7f32debe40
pwd address is 0x7f7f32debe40 <<注意这个地址,和上一个地址相同
heap address is 0x1b55420
global: 0x601060
|
|