我试图测试->
运算符,但我似乎无法做到这一点,因为当我执行以下程序并使用流提供输入时,程序停止工作
注意1:我在编译之前收到警告,它说:
格式'%s'期望类型' char *'的参数,但参数2具有类型 ' INT' [-Wformat =]
注意2:如果我省略了行printf("%s\n", *(&home1)->name )
,它可以正常工作,并且实际打印我写的任何内容。
#include <stdio.h>
#include <string.h>
typedef struct home_type {
char name[30] ;
}home;
int main (void) {
home home1 ;
char name[30] ;
scanf ("%[^\n]%*c", name);
strcpy( home1.name, name) ;
printf("%s\n", home1.name ) ;
printf("%s\n", *(&home1)->name ) ;
return 0 ;
}
答案 0 :(得分:5)
删除>>> name = input("Would you please enter your name: ") ;\
... age = int(input("Would you please enter your age: "))
Would you please enter your name: NicolausCopernicolaus
Would you please enter your age: 29
>>> name
'NicolausCopernicolaus'
>>> age
29
然后就可以了。您的代码*
类似于*(&home1)->name
,例如而不是将指针传递给第一个字符,它传递*(home1.name)
中第一个char
的值;由于默认参数促销,该值将转换为name
。
因此:
int
应该工作;但是你在这里不需要printf("%s\n", (&home1)->name );
; ->
现在只是更方便地使用指针结构的快捷方式;即->
成更可口的(*ptr).name
;由于ptr->name
已经是home
,而不仅仅是指向struct的指针,因此您应该使用struct
。
答案 1 :(得分:4)
您只需要放弃*
(即不取消引用):
printf("%s\n", (&home1)->name );
成员name
是一个数组,在传递给char*
时会转换为指针(printf()
)。但是,当您取消引用它时,它只会传递一个char
。
显然,它与printf()
对格式%s
的期望值不匹配。
答案 2 :(得分:4)
运营商->
和.
可以互换:
obj.field
与(&obj)->field
ptr->field
与(*ptr).field
请注意,您已为(&home1)->name
的结果添加了星号,这会生成char
。由于printf
是一个变量参数函数,char
在调用期间会被提升为int
,并解释警告。
当您为期望指针的参数传递int
时,会发生未定义的行为;在你的情况下,程序崩溃。删除解除引用运算符*
将解决此问题。
答案 3 :(得分:4)
(&home1)->name
是成员数组。 *(&home1)->name
是成员数组的解除引用,因为数组衰减等同于(&home1)->name[0]
。这个类型为char
。将char
传递到...
变量函数printf
,将其int
推广到...
(main.js
会导致default argument promotions。< / p>