将字符串指针数组传递给函数并读取字符串的值

时间:2014-10-01 23:17:28

标签: c arrays string pointers

我有一个赋值,我需要将一个字符串指针数组传递给一个函数,分配字符串然后读回这些字符串。这就是我在做的事情:

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()中打印它时,它是空白的。我在这里做错了什么?

3 个答案:

答案 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 ;
}

这就是为什么我讨厌使用指针,这会导致很多混乱,并且自身使用的指针使用错误的方式。仅在特殊情况下才应使用它们,例如将一些数组传递给函数,以防止对其进行两次复制。并且功能本身不需要输出值集。 但这只是在特殊情况下。无论如何,在程序的每一行上使用指针都是没有意义的。据我了解,指针的设计仅是因为函数和传递大量数据存在很多问题。