gpt4 book ai didi

c - 在函数中返回静态数组

转载 作者:行者123 更新时间:2023-11-30 21:35:03 25 4
gpt4 key购买 nike

我有这个功能

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
}

它仅在第一次调用中才给我正确的答案,但在其他调用中它不正确。不知道为什么,谢谢各位帮忙。

最佳答案

这是程序的清理版本:

#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

第一个电话的答案在我们背后改变了!怎么会这样?

答案当然是函数 ftab() 内的数组 tab[] 是静态的。它只有一份副本。每次调用 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) 返回相同的内容还是不同的内容?嗯,它们返回相同的指针,但是每次调用后,该指针指向的内容是不同的。

关于c - 在函数中返回静态数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51283563/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com