0

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

...程序刚刚终止

请告诉我我做错了什么

4

5 回答 5

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;
}
于 2013-03-25T20:27:15.803 回答
4

小心你在做什么getenv(),因为:

getenv() 函数返回一个指向环境中值的指针,如果不匹配,则返回 NULL。

因此,如果您传递的名称与现有环境变量不对应,那么您将返回 NULL,这将杀死您的strcpy(opt,getenv(env));

我推荐:

  1. 检查malloc()返回的内容并确保它不为空。
  2. 检查getenv()返回的内容并确保它不为空。
  3. 正如您所指出的,在您的 printf 中使用格式字符串并使用-Wall.
  4. 使用调试器单步执行您的代码,以确保它在您看到输出之前不会终止。
于 2013-03-25T20:25:45.940 回答
0

你确定: getenv(env) 将适合 "opt" 吗?我不这么认为。如果它不适合,那么 strcpy 可能会杀死你的程序。

更正: char * set_opts(char * env,char * path){ char * opt; 字符 * 值 = getenv(env); 选择=malloc(strlen(值)+strlen(路径)+1);strcpy(选择,值);strcat(选择,路径);返回选择;}

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

于 2013-03-25T20:33:43.850 回答
0

尝试摆脱getenv(env). 放strcpy(opt,env);. getenv()大概是回来了NULL

于 2013-03-25T20:27:47.790 回答
0

One possible reason: malloc returns NULL and you never check for it. Same for getenv(). And it must be

 malloc(strlen(getenv(env))+strlen(path)+1);

If the actual contents of getenv("windir") is longer than 6 characters, you write past the malloced buffer, which invokes undefined behavior.

于 2013-03-25T20:24:43.780 回答