【问题标题】:Set a String to a value and use it later将 String 设置为一个值并稍后使用
【发布时间】: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 现在将保留空闲内存。在这种情况下,它指向的数据是未知的。

标签: c arrays loops pointers


【解决方案1】:

原因:

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

 programName = concatPath; 

在这里释放分配的值

 free(concatPath);

显然programName 从这一点开始将指向一块已释放的内存。

如何解决:

  1. 使用单独的变量
  2. 分配它以保持正确的长度
  3. strcpy 进去,因为指针赋值不会复制字符串。
  4. 使用它
  5. 释放它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多