#include<stdio.h>
char *getname()
{
static char name[30];
scanf("%s",name);
return name;
}
void main()
{
char * name1,*name2;
name1 = getname();
name2 = getname();
printf("%s %s\n",name1,name2);
}
输入: Jack Jill
输出: Jill Jill
我认为它应该是Jack Jack,因为它存储了输入的初始值。
答案 0 :(得分:3)
name1
和name2
指向同一个对象:name
的第一个元素。
由于指针name1
和name2
具有相同的值,因此在打印数组时会出现相同的结果。
静态对象的生命周期是程序的整个执行,静态对象的地址在程序执行期间不会改变。
答案 1 :(得分:2)
函数体内声明为static
的变量将在函数调用中保留其值。不过,您仍然可以更改此值。
答案 2 :(得分:1)
在本质上,静态变量(在此上下文中,至少)与全局变量相同,只是它不能被声明它的上下文之外的代码“看到”。
因此,您的函数中只有一个变量name
,因此每次调用getname
都会覆盖上次name
中的任何内容。因此,当您第二次调用它来获取Jill
时,它会覆盖名称Jack
。
你可以做,例如:
char name1[30], name2[30];
strcpy(name1, getname());
strcpy(name2, getname());
但我首选的解决方案是将name
变量传递给:
char name1[30], name2[30];
getname(name1);
getname(name2);
然后删除函数中的char name[30];
,只需:
void getname(char *name)
{
scanf("%s", name);
}
更容易也没问题。
答案 3 :(得分:0)
此代码中只有一个char
数组。这就是名为static
的{{1}}数组。每次调用name
时,都会使用用户的输入填充getname
数组。然后返回指向此数组的第一个元素的指针(name
)。您将这些返回的指针存储在char*
和name1
中。他们都指向同一个数组。因此,当name2
和printf
中的每一个name1
时,您都会得到相同的输出。也就是说,您获得最后输入name2
的字符。