输入时静态变量存储的值是多少?

时间:2013-05-08 22:17:23

标签: c++ c variables static scanf

#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,因为它存储了输入的初始值。

4 个答案:

答案 0 :(得分:3)

name1name2指向同一个对象:name的第一个元素。

由于指针name1name2具有相同的值,因此在打印数组时会出现相同的结果。

静态对象的生命周期是程序的整个执行,静态对象的地址在程序执行期间不会改变。

答案 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中。他们都指向同一个数组。因此,当name2printf中的每一个name1时,您都会得到相同的输出。也就是说,您获得最后输入name2的字符。