【问题标题】:Passing array of string pointers to function and reading value of the strings将字符串指针数组传递给函数并读取字符串的值
【发布时间】:2014-10-01 23:17:27
【问题描述】:

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

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

【问题讨论】:

标签: c arrays string pointers


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    这类问题似乎不断出现。

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

    【讨论】:

    • (请注意,C++ 可以帮助您更干净地完成很多这些事情,比如为您管理所有这些的字符串类......所以不要绝望。这只是基础机制。)
    • 很好奇,为什么要在这里提到另一种语言(C++)的能力?
    【解决方案3】:

    这是一个很老的帖子,但我必须更新它,因为我有类似的问题,我发现,在函数的一侧,我只需要使用一次指针,并且数组被恢复,就像我从外面使用这个原始的一样.

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

    这就是我讨厌使用指针的原因,这让我很困惑,而且它自己的指针被错误地使用了。它们应该只在特殊情况下使用,比如将一些数组传递给函数,以防止复制两次。并且它本身的功能不需要输出一组值。 但这只是在特殊情况下。如果编译器无论如何都在做,在程序的每一行上使用指针是没有意义的,据我所知,指针是设计的,只是因为函数和传递大量数据存在很多问题。

    【讨论】:

    • 是否存在复制/粘贴问题? str[1] = (temp,"Apple"); 不会编译。有关信息char str[2] ; 声明两个字符的数组,而不是指向两个字符串的指针。无论如何我建议你多了解指针,C中有一个主要特性。
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2016-12-08
    • 2014-09-06
    • 1970-01-01
    • 2011-05-12
    相关资源
    最近更新 更多