C char *功能问题

时间:2013-03-25 20:20:49

标签: c char

我需要帮助,我只是在学习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);

...程序刚终止

请告诉我我做错了什么

5 个答案:

答案 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));

我建议:

  1. 检查malloc()的返回(确保非空)
  2. 检查getenv()的回复(检查相同)
  3. 正如您所指出的那样,在printf中使用格式字符串并使用-Wall进行编译
  4. 使用调试器来执行代码,以确保它不会在您看到输出之前终止

答案 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(优化,路径);         返回选择;     }

这样,你确定你有足够的空间。