strncpy断层
我一直很难让这段代码正常工作。我试图得到一个要复制的字符数组,这样我就可以计算出要动态分配和保存的令牌数量,以便检查环境变量。但是,当它试图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);
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:你说得对!我有点太快了,只想到了目标缓冲区太短,无法容纳源字符串的情况。谢谢你的更正!