QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 934|回复: 10

一个c的问题

[复制链接]
发表于 2003-5-13 20:03:17 | 显示全部楼层 |阅读模式
我在一个函数里写:
[code:1]
char *home=NULL;
home=getenv("HOME");
printf("%s\n",home);
strcat(home,"ksdnovs");
printf("%s\n",home);
[/code:1]

输出是:
/root
/rootksdnovs
第二掉用这个函数的时候:
/rootksdnovs
/rootksdnovsksdnovs

getenv干嘛不在"/root"后加一个'\0'?

感叹c他妈的实在是太烦了
请问如何避免这个问题
发表于 2003-5-13 22:24:26 | 显示全部楼层
u strcat already changes the env variable. so try to copy the home to a new string varible before u do strcat.
回复

使用道具 举报

 楼主| 发表于 2003-5-13 22:40:05 | 显示全部楼层
strcat 改变了值我没意见  但我觉得getenv函数很奇怪

我想getenv("HOME")只是返回一个指针 指向"HOME"
但getenv干嘛不在"/root" 后面加一个\0?  
这样问题不就解决了

是getenv故意不加\0的吗?   不加\0有啥好处?
回复

使用道具 举报

发表于 2003-5-13 22:44:38 | 显示全部楼层
HOME=root.
getenv return a pointer to root and there is a \0 after root
that is why u can print home
but after u strcat, u change the root to rootsdnovs. then the \0 is after rootsdnovs now.
回复

使用道具 举报

发表于 2003-5-14 10:39:47 | 显示全部楼层
每个程序有自己的环境变量区,getenv()返回的指针就指向环境变量区的某处,如果要strcat()的话,应该把你要修改的字符串strcpy()出来,如果要修改环境变量应该用putenv(),像你那样直接strcat()就会覆盖掉HOME后面(实现不同,也许是前面)的环境变量。
回复

使用道具 举报

发表于 2003-5-14 14:05:01 | 显示全部楼层
说了半天,都是你的错,快还getenv()清白!
回复

使用道具 举报

 楼主| 发表于 2003-5-14 16:16:24 | 显示全部楼层
aaaaaaaa
别说的这样严重啊
但是
我觉得getenv()是有点怪啊

既然我用了strcat() 破坏了 "HOME"
那getenv()应该把它改回来啊  
我把"/root"  变成了"/rootsdnovs"
那下一次调用getenv()的时候应该变为   "/root\0dnove" 才对啊!!
回复

使用道具 举报

发表于 2003-5-14 19:23:02 | 显示全部楼层
以我的理解

getenv()返回了一个指向串的指针,内容是HOME
然后调用strcat()修改了那个串。

所以,你下一次调用getenv()返回的就是你修改过的串

mycode:

[code:1]
#define SIZE 20

char home[SIZE];
strcpy(home, getenv("HOME"))
printf("%s\n",home);
strcat(home,"ksdnovs");
printf("%s\n",home);

[/code:1]
回复

使用道具 举报

 楼主| 发表于 2003-5-14 21:23:04 | 显示全部楼层
谢谢各位

但我还是认为getenv()不太合理
haha
回复

使用道具 举报

发表于 2003-5-15 01:11:21 | 显示全部楼层
还是没理解清楚,例子:

程序的环境变量区(部分):
...HOME=/root\0JAVA_HOME=/usr/local/j2sdk\0...

home = getenv("HOME")之后:
...HOME=(home指向这里)/root\0JAVA_HOME=/usr/local/j2sdk\0...

如果直接strcat(home, "ksdnovs")环境变量区就变成:
...HOME=/rootksdnovs\0ME=/usr/local/j2sdk\0...
覆盖了HOME后面的环境变量
回复

使用道具 举报

发表于 2003-5-15 12:00:08 | 显示全部楼层
getenv()每次返回的都是一个指向了HOME的指针,当你第一次调用getenv()时,当前的HOME是/root,getenv()就将HOME的地址返回给了home变量,现在home和HOME指向的是同一片内存空间,但是当你使用srtcat后,对home所指向的单元作了修改,同时也修改了HOME的内容,所以当你第二次调用getenv()时,返回的还是HOME的内容,不过这个内容是你已经修改过了的,所以和第一次的结果不一样。

因此在编程中一定要注意对指针变量的操作,如果没有必要的话,尽量使用传值操作,而不要使用传地址操作。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-15 22:25 , Processed in 0.044881 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表