ошибка сегментации strncpy

У меня возникли проблемы с тем, чтобы этот раздел кода работал. Я пытаюсь получить массив символов для копирования, чтобы я мог подсчитать, сколько токенов есть для динамического выделения и сохранения их для проверки переменных среды. Тем не менее, я продолжаю segfaulting, когда он пытается выполнить strncpy исходную строку.

    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. Любая помощь приветствуется


person GFXGunblade    schedule 26.09.2011    source источник


Ответы (3)


Вы не выделили память для copy.

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

Попробуйте malloc или strdup, если вам не нужны полные 81 символ.

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

/* Or strdup. */
copy = strdup(str1);
person cnicutar    schedule 26.09.2011
comment
Имейте в виду, что strncpy не завершает нулем строку назначения! Вы редко хотите использовать эту функцию. В этом случае strdup, вероятно, то, что вам нужно. Также имейте в виду, что вам нужно освободить копию, так как strdup выделяет для нее новую память! - person harald; 26.09.2011
comment
@harald: имейте в виду, что strncpy делает нулевое завершение строки, если исходная строка короче заданной длины. На самом деле он не только завершается нулем, но и заполняет остальную часть буфера. Имейте также в виду, что strdup() не является языком C в том смысле, что он не входит в стандарт C99. К сожалению, нет и strlcpy(), улучшенной версии strncpy(). - person JeremyP; 26.09.2011
comment
@JeremyP: Ты прав! Я был слишком быстр, подумав только о случае, когда буфер назначения слишком короток, чтобы соответствовать исходной строке. Спасибо за исправление! - person harald; 26.09.2011

copy не содержит допустимого выделенного адреса. Пожалуйста, выделите достаточно памяти с помощью malloc перед использованием copy. Также не забудьте освободить copy после завершения его использования, чтобы предотвратить утечку памяти в больших программах.

person phoxis    schedule 26.09.2011

Я думаю, что в функции echo вы не инициализировали счетчик переменных и пытаетесь увеличить и уменьшить его. Попробуйте сделать это.

person Parth Kansara    schedule 26.09.2011