我需要帮助,我只是在学习C,不知道出了什么问题:
我在这里致电set_opts
函数:
char * tmploc ;
tmploc=set_opts("windir","\\temp.rte");
printf(tmploc);
(我知道,printf没有格式化,只是用于测试目的)
功能看起来像这样:
char * set_opts(char * env,char * path){
char * opt;
opt=malloc(strlen(env)+strlen(path)+1);
strcpy(opt,getenv(env));
strcat(opt,path);
return opt;
}
一切都很好,但是当我再试一次时:
char * tmploc2 ;
tmploc2=set_opts("windir","\\temp.rte");
printf(tmploc2);
...程序刚终止
请告诉我我做错了什么
答案 0 :(得分:6)
您使用env
分配字符串的长度,然后使用getenv(env)
填充它。如果getenv(env)
超过env
,那么您很有可能发生段错误。您的意思是使用strlen(getenv(env))
吗?
您真的应该在代码中添加一些错误检查:
char *set_opts(char *env, char *path)
{
char *opt;
char *value;
value = getenv(env);
if (value == NULL)
... handle error
opt = malloc(strlen(value)+strlen(path)+1);
if (opt == NULL)
... handle error
strcpy(opt,value);
strcat(opt,path);
return opt;
}
答案 1 :(得分:3)
通过getenv()
注意你正在做的事情,这个函数:
getenv()函数返回指向环境中值的指针,如果没有匹配则返回NULL。
因此,如果您传递的内容不是环境变量,那么您将获得NULL并且会导致您的strcpy(opt,getenv(env));
我建议:
malloc()
的返回(确保非空)getenv()
的回复(检查相同)-Wall
进行编译答案 2 :(得分:0)
一个可能的原因:malloc返回NULL
并且您从未检查过它。对于getenv()也是如此。
它一定是
malloc(strlen(getenv(env))+strlen(path)+1);
如果getenv(“windir”)的实际内容超过6个字符,则通过malloced缓冲区写入,该缓冲区将调用未定义的行为。
答案 3 :(得分:0)
尝试摆脱getenv(env)
。只需添加strcpy(opt,env);
。 getenv()
可能正在返回NULL
。
答案 4 :(得分:0)
你确定: GETENV(ENV) 适合“选择”? 我不这么认为。如果它不适合,那么strcpy可以杀死你的程序。
更正: char * set_opts(char * env,char * path){ char * opt; char * value = getenv(env); 选择= malloc的(strlen的(值)+的strlen(路径)+1); 的strcpy(优化,值); 的strcat(优化,路径); 返回选择; }
这样,你确定你有足够的空间。