linux 中getcwd函数使用解析

来源:互联网 发布:西安朝阳软件培训中心 编辑:程序博客网 时间:2024/06/05 05:44
/*********************************************************************************
 *      Copyright:  (C) 2017 alex_walker<alex_walker@126.com> 
 *      All rights reserved.
 *    
 *      Filename:  getcwd_test.c
 *      Description:  This file 
 *                        
 *      Version:  1.0.0(10/10/2017~)
 *      Author:  alex_walker <alex_walker@126.com>
 *      Log:  1, Release initial version on "10/10/2017
 *      10:15:30 AM"
 *      
 *********************************************************************************/




#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>




int main(int argc,char *argv[])
{
unsigned char *buf = NULL;
//buf = malloc(50);

//unsigned char buf[50] = {0};

printf("p buf = %p\n",buf);
//buf = getcwd(NULL, 50);
//buf = getcwd(NULL, 5);
//buf = getcwd(buf, 50);
//buf = getcwd(buf, 5);

//getcwd(buf, 5);
//getcwd(buf, 50);
printf("p buf = %p\n",buf);

if(buf == NULL)
{
perror("failed to getcwd");
}
else
{
printf("pwd = %s,len = %d\n",buf,strlen(buf));
free(buf);
}


return 0;
}
指针赋值测试
测试1:
unsigned char *buf = NULL;
buf = getcwd(NULL, 50);
结果:
p buf = (nil)
p buf = 0x8ed9008
pwd = /home/huahuan/test,len = 18
测试2:在测试1的基础上把buf = getcwd(NULL, 50);改成buf = getcwd(NULL, 5);
结果:
p buf = (nil)
p buf = (nil)
failed to getcwd: Numerical result out of range
测试3:
unsignedchar*buf=NULL;
getcwd(buf, 50);
结果:
p buf = (nil)
p buf = (nil)
failed to getcwd: Success
malloc赋值测试
测试1:
unsignedchar*buf=NULL;
buf = malloc(50);
buf = getcwd(NULL, 50);
结果::
p buf = 0x8a4e008
p buf = 0x8a4e040
pwd = /home/huahuan/test,len = 18
取到了目录地址,但是buf的地址不再是malloc的地址,对比测试1可知,发生了内存泄漏,当参数1为NULL时,getcwd会再次创建malloc空间。
测试2:在测试4的基础上buf = getcwd(NULL, 50)改为 getcwd(buf, 50)
结果:
p buf = 0x9dcf008
pbuf = 0x9dcf008
pwd = /home/huahuan/test,len = 18
测试3: 在测试5的基础上getcwd(buf, 50)改为getcwd(buf, 5)
结果:
p buf = 0x97e0008
p buf = 0x97e0008
pwd = ,len = 0
数组赋值测试
测试1:不使用指针,使用数组
unsigned char buf[100] = {0};printf("p buf = %p\n",buf);getcwd(buf,sizeof(buf));printf("p buf = %p\n",buf);if(getcwd(buf,sizeof(buf)) == NULL ){perror("failed to getcwd");}else { printf("pwd = %s,len = %d\n",buf,strlen(buf));//free(buf);}
结果 : 
p buf = 0xbfff2888p buf = 0xbfff2888pwd = /home/huahuan/test,len = 18
测试2:
将unsigned char buf[100] = {0};改为unsigned char buf[5] = {0};
将getcwd(buf,sizeof(buf));改为getcwd(buf,5);
结果:
p buf = 0xbfc6964bp buf = 0xbfc6964bfailed to getcwd: Numerical result out of range
结论: 
使用malloc,需要将缓存地址指针赋值给参数1,且空间一定要大于路径长度,否则函数错误,且error报错
使用数组,需要将缓存地址指针赋值给参数1,且空间一定要大于路径长度,否则函数错误,且error报错
使用
推荐使用:使用指针赋值,且参数1 为NULL,系统会自动给指针创建相应大小的malloc空间,记得在调取函数完毕后,free空间
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 婚姻质量差不幸福该怎么办 吸毒犯戒毒所不收怎么办 信用卡到期人进拘留所怎么办? 人在拘留所信用卡逾期怎么办 探视权不让接走怎么办 医保过了缴费期怎么办 充电宝充手机慢怎么办 执行局执行不到钱怎么办 小孩挖耳朵疼了怎么办 挖耳朵挖破了怎么办 挖耳朵皮挖破了耳鸣怎么办 北京自考证丢啦怎么办 不服检察院的答复函该怎么办 检察院控申答复函不复怎么办 在看守所里疯了怎么办 第一次吸毒拘留五天第二次会怎么办 被派出所拘留15天怎么办 老公从拘留所出来聪明老婆怎么办 中信信用卡忘记还款了怎么办 监狱的犯人病了怎么办 判缓期间在行政拘留怎么办 法院拘留15天工作怎么办 高血压签定了无期限合同怎么办 法院司法拘留找不到人怎么办 c1骑摩托车要拘留怎么办 欠钱的找不到人怎么办 治安拘留人跑了怎么办 行政拘留拘留所不收应该怎么办 在看守所被打了怎么办 取保候审超过12个月怎么办 拘留20天还没有判刑怎么办 被打了没有证据怎么办 拘留37天后没有放人怎么办 强制执行执行的财产不够怎么办 收到公安局拘留通知家属应该怎么办 对方不出谅解书怎么办 寻衅滋事没抓的 怎么办 公务员政审父母拘留过怎么办 我参与了网赌怎么办 亲人出车祸去世家属怎么办 车牌换了原保险怎么办