2

コードのこのセクションを機能させるのに問題がありました。コピーする文字配列を取得しようとしているので、動的に割り当てて保存するトークンの数を取得して、環境変数を調べることができます。ただし、元の文字列をstrncpyしようとすると、segfaultが発生し続けます。

    void echo(char *str1)
    {
      char *token, *temp;
      char *saveptr1;
      int j, i, k, counter;
      char *copy;

      strncpy(copy, str1, 80);

      const char *delim = " ";
      i = strlen(copy);

      for(j = 0; j < i; j++, copy = NULL)
      {
         token = strtok_r(copy, delim, &saveptr1);
         counter++;
         if(token == NULL)
         {
           counter--;
           break;
         }
      }

      // initialize token array for echo
      char *tokAr[counter];
      for(j = 0; j < counter; j++)
        tokAr[j] = malloc(80*sizeof(char));

      for(j = 0, k = 0; j < i; j++, str1 = NULL)
      {
         tokAr[k] = strtok_r(str1, delim, &saveptr1);
         if( tokAr[k] != NULL)
         {
            if(strchr(tokAr[k], 36) != NULL)
            {
              temp = enviro(tokAr[k]);
              printf("%s ", temp);
            }
         else
           printf("%s ", tokAr[k]);
         }
         else
           break;
      }

      for(k = 0; k < counter; k++)
        free(tokAr[k]);
    }

    char* enviro(char *ret)
    {
      char *copy, *expand, *saveptr;
      const char *delim = "$";
      strcpy(copy, ret);
      expand = strtok_r(copy, delim, &saveptr);

      return getenv(expand);
    }

渡されたstr1文字配列をコピーする方法と関係があることはわかっていますが、gdbからは理解できません。どんな助けでも大歓迎です

4

3 に答える 3

9

にメモリを割り当てていませんcopy

char *copy;
strncpy(copy, str1, 80);

試してみるmallocstrdup、81文字すべてが必要ない場合。

copy = malloc(81);
strncpy(copy, str1, 80);

/* Or strdup. */
copy = strdup(str1);
于 2011-09-26T07:04:34.063 に答える
2

copy有効な割り当てられたアドレスが含まれていません。mallocを使用する前に、十分なメモリを割り当ててくださいcopy。またcopy、大規模なプログラムでのメモリリークを防ぐために、使用が完了したら解放することを忘れないでください。

于 2011-09-26T07:19:25.033 に答える
0

関数エコーでは、変数カウンターを初期化しておらず、インクリメントとデクリメントを試みていないと思います。そうしてみてください。

于 2011-09-26T08:52:48.170 に答える