在函数中返回静态数组

时间:2018-07-11 10:48:27

标签: c arrays function

我有此功能

int* ftab(int n)
 {
  static int tab[2];
   tab[0] = n;
   tab[1] = n+1;
   return tab;
   }

 void caller()
  {
   int* tab = ftab(3); // it gives me correct result
   int * tab=ftab(2)  // but when I use another time it makes incorrect 
                         answer
 }

仅在第一次通话中才第一次给我正确的答案,但在其他通话中这是不正确的。我不知道为什么,谢谢您的帮助。

2 个答案:

答案 0 :(得分:1)

这是程序的清理版本:

#include <stdio.h>

int *ftab(int n)
{
    static int tab[2];
    tab[0] = n;
    tab[1] = n+1;
    return tab;
}

int main()
{
    int *tab1 = ftab(3);
    printf("first: %d %d\n", tab1[0], tab1[1]);

    int *tab2 = ftab(2);
    printf("second: %d %d\n", tab2[0], tab2[1]);

    printf("but first is now: %d %d\n", tab1[0], tab1[1]);
 }

首先打印

first: 3 4

这是致电ftab(3)的正确答案。

然后打印

second: 2 3

这是致电ftab(2)的正确答案。

但随后会打印

but first is now: 2 3

第一个电话的答案在我们背后变了!怎么可能呢?

当然,答案是函数tab[]中的数组ftab()是静态的。只有一本。每次您调用ftab时,它都会被重用。每次新呼叫都会覆盖以前的内容。

如果您还打印出ftab返回的指针值,则可以更清楚地了解发生了什么。如果我将main更改为此:

int main()
{
    int *tab1 = ftab(3);
    printf("first: %p: %d %d\n", tab1, tab1[0], tab1[1]);
    int *tab2 = ftab(2);
    printf("second: %p: %d %d\n", tab2, tab2[0], tab2[1]);
    printf("but first is now: %p: %d %d\n", tab1, tab1[0], tab1[1]);
 }

现在可以打印

first: 0x10b35e018: 3 4
second: 0x10b35e018: 2 3
but first is now: 0x10b35e018: 2 3

因此ftab每次都返回完全相同的指针值!怎么可能?答案是,它总是返回指向同一静态数组tab的指针,但是每次都用不同的值填充该数组。

这里有几节课:

  1. 函数无法返回数组。
  2. 一个函数可以返回一个指向静态数组的指针,但这并不是一个完美的替代方法。
  3. 当函数返回指向静态数组的指针时,您不想保存该指针的副本并在以后使用它,因为结果可能被另一个对该函数的调用覆盖。
  4. 指针不是数组。指针可以指向一个数组,但是该数组的内容可以从指针下方更改。
  5. 使用指针时,您必须牢记指针指针所指向的之间的区别。该代码提供了这种区别的完美示例。呼叫ftab(2)ftab(3)返回的是相同还是不同?嗯,它们返回相同的 pointer ,但是在每次调用后,指针指向的内容都不相同。

答案 1 :(得分:1)

您必须打开编译器警告。它会告诉您出什么问题了:

   int *tab = ftab(3);
   int *tab = ftab(2);

您的第二个int *tab是错误的,因为已经声明了tab。该语句还存在一个错误,因为它没有终止的分号。因此,您的编译器做了一些事情,您看到一个错误。您如何看待错误?我看不到打印语句。

以下内容应该可以正常工作:

   int *tab= ftab(3);
   printf("%d, %d\n", tab[0], tab[1]);
   ftab(2);
   printf("%d, %d\n", tab[0], tab[1]);

请注意,在第二个调用中,您不需要分配,因为tab已经指向静态数组。它只有新的价值。