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,但是为什么programName成功设置为HERE的新值concatPath,当我在那里打印它?此外,为什么programName会忘记当我想在最后一行使用它时,它的价值是完全的吗?)
答案 0 :(得分:2)
原因:
在此您将其指定为刚刚分配的值:
programName = concatPath;
在这里释放分配的值
free(concatPath);
从这一点来看,显然programName
将指向一段释放的记忆。
如何修复它:
strcpy
进入它,因为指针赋值不会复制字符串。