2014-10-01 48 views
0

我有一个赋值,我需要将一个字符串指针数组传递给函数,分配字符串,然后回读这些字符串。下面是我在做什么:将字符串指针的数组传递到函数并读取字符串的值

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

[请参阅此处](http://stackoverflow.com/questions/1224042/returning-a-pointer-to-an-automatic-variable/)解释 – 2014-10-01 23:30:18

回答

1

您在str中存储了局部变量temp(该数组衰减为指针)的第一个元素的地址,但该数组的寿命在getStr()返回时结束。因此,您在生命周期结束后正在访问局部变量,并导致未定义的行为。

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()

+0

*(请注意,C++有助于做很多这些事情更像一个字符串类,为你管理所有这些......所以不要绝望,它只是基础机制。)* – HostileFork 2014-10-01 23:29:52

+0

好奇,为什么要在这里提到另一种语言的(C++)能力? – chux 2014-10-02 02:20:24