1

在下面的示例中,为什么我不能使用

scanf("%s%d%d", p.name, p.age, p.code);

如果变量p已经有一个地址,那么为什么我需要放置 &p->age而不是p.age?为什么我需要使用 'p->name' 从键盘读取字符串而不是p.nameor &p->name?如果p->name相等(*p).name,并且需要一个地址,那么如果将指向的值传递给函数,它会scanf("%s",&variable)如何工作?(*p).namescanfp

#include <stdio.h>
#include <stdlib.h>
struct person{
    char name[60];
    int age;
    int code;
};

void printdata(struct person *p){
   printf("%s, %d, %d",p->name, p->age, p->code);
}

int main(int argc, char *argv[]){
   struct person *p;
   p = (struct person*) malloc(sizeof(struct person));
   scanf("%s%d%d", p->name, &p->age, &p->code);
   printdata(p);
   free(p);
   return 0;
}
4

2 回答 2

1

p是一个指向结构的指针; p->age取消引用该指针并获取age成员,该成员是整数,而不是指针;&p->age采用 的地址p->age。所以p没有age成员,虽然有,但*p您正在传递*p's age 成员的地址以进行扫描。

至于(*p).name(ie p->name),这是因为无论如何字符串都表示为指向字符数组的指针,因此您可以像以前一样将字符串传递给 scanf ,它只是覆盖其中的字符。这是危险的!因此,如果您输入的名称超过 60,您的代码可能会缓冲溢出并崩溃。

于 2013-09-10T20:54:42.350 回答
1

对于你的第一个问题:

如果变量p已经有一个地址,那么为什么我需要放置&p->age而不是p.age

您声明p为指针

struct person *p;

这意味着如果您想访问例如年龄成员,您必须首先取消引用指针:

(*p).age

这完全等于符号

p->age

但是scanf,对于整数,该函数需要一个指向 int 的指针。由于p->age指向一个 int,您必须age通过其地址传递成员。由于->运算符优先于您,&因此您可以将其简单地写为

&p->age

name成员的区别p在于,由于它被声明为char's的数组

 p->name

实际上已经是一个指针,并且指向 的第一个元素name。因此,当您将其传递给时,您不需要&前面的运算符p->namescanf

于 2013-09-10T21:02:36.030 回答