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


当我在这里打印programName时,的确是concatPath。但是,当我实际上要在所附代码的最后一行中使用它时,programName将变为空。请注意,ProgramName是在if循环之外的第一行中定义的。

为什么会这样,我该如何解决?

(我以为问题是我不能像这样重置字符串programName,但是为什么在这里打印时,programName成功设置为新值concatPath?在这里,为什么我却完全忘记了它的值?想要在最后一行使用它吗?)

最佳答案

原因:

在这里,将其分配为刚刚分配的值:

 programName = concatPath;


在这里您释放分配的值

 free(concatPath);


显然,从这一点来看,programName将指向一块已释放的内存。

解决方法:


使用一个单独的变量
分配它以保持正确的长度
strcpy放入其中,因为指针分配不会复制字符串。
用它
释放它。

09-26 22:08