我在运行这段代码时遇到了麻烦。我正在尝试获取一个要复制的字符数组,这样就可以计算出有多少个令牌可以动态分配和保存,以便检查环境变量。但是,当它试图对原始字符串进行strncpy时,我一直在执行segfaulting。
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中找出原因。非常感谢您的任何帮助。
发布于 2011-09-26 15:04:34
您尚未为copy
分配内存。
char *copy;
strncpy(copy, str1, 80);
如果不需要完整的81个字符,请尝试使用malloc
或strdup
。
copy = malloc(81);
strncpy(copy, str1, 80);
/* Or strdup. */
copy = strdup(str1);
发布于 2011-09-26 15:19:25
copy
不包含有效的分配地址。在使用copy
之前,请使用malloc
分配足够的内存。此外,请记住在使用完copy
后释放它,以阻止大型程序中的内存泄漏。
发布于 2011-09-26 16:52:48
我认为在echo函数中,你还没有初始化变量counter,并试图递增和递减它。试着这样做。
https://stackoverflow.com/questions/7551624
复制相似问题