strncpy断层

strncpy断层,c,segmentation-fault,strncpy,C,Segmentation Fault,Strncpy,我一直很难让这段代码正常工作。我试图得到一个要复制的字符数组,这样我就可以计算出要动态分配和保存的令牌数量,以便检查环境变量。但是,当它试图strncpy原始字符串时,我会继续分段 void echo(char *str1) { char *token, *temp; char *saveptr1; int j, i, k, counter; char *copy; strncpy(copy, str1, 80);

我一直很难让这段代码正常工作。我试图得到一个要复制的字符数组,这样我就可以计算出要动态分配和保存的令牌数量,以便检查环境变量。但是,当它试图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);
    }
void echo(char*str1)
{
字符*标记,*温度;
char*saveptr1;
int j,i,k,计数器;
字符*副本;
strncpy(拷贝,str1,80);
const char*delim=“”;
i=strlen(副本);
对于(j=0;j

我知道这与我如何复制传入的str1字符数组有关,但我无法从gdb中找到它。非常感谢您提供的任何帮助

您尚未为
复制
分配内存

char *copy;
strncpy(copy, str1, 80);
如果不需要完整的81个字符,请尝试
malloc
strdup

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

/* Or strdup. */
copy = strdup(str1);

copy
不包含有效的分配地址。在使用
copy
之前,请使用
malloc
分配足够的内存。另外,请记住,在完成使用它来阻止较大程序中的内存泄漏后,请释放
copy

我认为在函数echo中,您尚未初始化变量计数器并尝试递增和递减它。
尝试这样做。

请注意strncpy不会以零结束目标字符串!您很少想使用此函数。在这种情况下,strdup可能就是您想要的。还要注意,您需要释放拷贝,因为strdup为它分配了新内存@harald:请注意,只要源字符串短于给定长度,strncpy就不会以零结束字符串。事实上,它不仅会终止zero,还会填充缓冲区的其余部分。还要注意,
strdup()
不是C,因为它不在C99标准中。不幸的是,
strlcpy()
strncpy()
的改进版@JeremyP:你说得对!我有点太快了,只想到了目标缓冲区太短,无法容纳源字符串的情况。谢谢你的更正!