【发布时间】:2016-02-16 09:45:04
【问题描述】:
char * programName = tokens_get_token(tokens, 0);
if (access(programName, F_OK) != 0){
/*name not okay, set programName to correct path-name*/
char * fullpath = getenv("PATH");
/*/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:*/
for (char * p = strtok(fullpath, ":"); p!= NULL; p = strtok(NULL, ":")){
char * concatPath = malloc(strlen(programName) +strlen(p) + 2);
strcpy(concatPath, p);
strcat(concatPath, "/");
strcat(concatPath, programName);
printf("%s\n", concatPath);
bool toBreak = false;
if (access(concatPath, F_OK) == 0){
/*can a string be reset like this? */
programName = concatPath;
HERE
toBreak = true;
}
free(concatPath);
if (toBreak){
break;
}
}
}
printf("%s%s\n", programName, "is programName");
execv(programName, listOfArgs);
当我在 HERE 打印 programName 时,它确实是 concatPath。但是,当我真的想在附加代码的最后一行中使用它时,programName 变为空。请注意,ProgramName 是在 if 循环之外的第一行中定义的。
为什么会这样我该如何解决它?
(我认为问题是我不能像那样重置字符串 programName 但是为什么程序名在 HERE 成功设置为新值 concatPath,当我在那里打印它时?此外,为什么 programName 忘记了它的值完全当我想在最后一行使用它时?)
【问题讨论】:
-
您在 concatPath 上使用“free”,因此指向它的 ProgramName 现在将保留空闲内存。在这种情况下,它指向的数据是未知的。