我有一个赋值,我需要将一个字符串指针数组传递给一个函数,分配字符串然后读回这些字符串。这就是我在做的事情:
void getStr(char *str[])
{
char temp[256];
strcpy (temp,"Apple");
*str = temp;
printf("\ngetStr Str= %s",*str);
str++;
strcpy (temp,"Mango");
*str = temp;
printf("\ngetStr Str= %s",*str);
str++;
}
int main()
{
char *str[2] ;
int i=0;
getStr (str);
for(i =0 ;i<2;i++)
printf("\nstr addr =%x, str= %s\n",&str[i],str[i]);
return 1 ;
}
Here is my output:
getStr Str= Apple
getStr Str= Mango
str addr =28d623b0, str=
str addr =28d623b8, str=
因此str在getStr()中正确分配了字符串,但是当我在main()中打印它时,它是空白的。我在这里做错了什么?
答案 0 :(得分:1)
您将str
存储在局部变量temp
的第一个元素的地址中(数组衰减为指针),但该数组的生命周期结束getStr()
回报。因此,您在生命周期结束后访问本地变量,并且会产生未定义的行为。
答案 1 :(得分:0)
这种问题似乎不断出现。
void getStr(char *str[])
{
char temp[256];
...
}
temp
数组是一个内存块,其生命周期与getStr
函数的持续时间相关联。
此外,当您将其从“Apple”覆盖到“Mango”时,您存储的用于指向str [0]中的temp
的指针将指向“Mango”。 str [0]和str [1]持有相同的指针!从函数返回后,该指针不再指向有效内存。 : - /
对于这些类型的问题,C程序员使用strdup之类的东西。这为每个字符串进行了内存分配,并且比必须执行strlen / malloc / strcpy更符合人体工程学。无论哪种方式,当你完成它们时,请记住free()
每个字符串。
答案 2 :(得分:0)
这是一个很老的帖子,但是我必须更新它,因为我有类似的问题,而且我发现,在函数的那一侧,我只需要使用一次指针,就可以像从外部使用此原始版本那样还原数组。
void getStr(char *str)
{
str[1] = (temp,"Apple");
str[2] = (temp,"Mango");
}
int main()
{
char str[2] ;
int i=0;
getStr (str);
for(i =0 ;i<2;i++)
printf(str[i]);
return 1 ;
}
这就是为什么我讨厌使用指针,这会导致很多混乱,并且自身使用的指针使用错误的方式。仅在特殊情况下才应使用它们,例如将一些数组传递给函数,以防止对其进行两次复制。并且功能本身不需要输出值集。 但这只是在特殊情况下。无论如何,在程序的每一行上使用指针都是没有意义的。据我了解,指针的设计仅是因为函数和传递大量数据存在很多问题。