我有此功能
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
}
仅在第一次通话中才第一次给我正确的答案,但在其他通话中这是不正确的。我不知道为什么,谢谢您的帮助。
答案 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
的指针,但是每次都用不同的值填充该数组。
这里有几节课:
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
已经指向静态数组。它只有新的价值。