-1
#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

4 回答 4

3

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

由于两个指针name1name2具有相同的值,因此在打印数组时得到相同的结果是正常的。

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

于 2013-05-08T22:19:45.507 回答
2

static在函数体内声明的变量将在函数调用中保留其值。不过,您仍然可以更改此值。

于 2013-05-08T22:19:39.647 回答
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);
}

容易得多,没有问题。

于 2013-05-08T22:22:56.687 回答
0

这段代码中只有一个数组char。这就是static名为 的数组name。在每次调用 时getname,您都用用户的输入填充name数组。然后你返回一个指向这个数组的第一个元素的指针(a char*)。您将这些返回的指针存储在name1和中name2。它们都指向同一个数组。因此,当您printf使用name1和时name2,您将获得相同的输出。也就是说,您将获得最后输入到name.

于 2013-05-08T22:20:45.357 回答