我正在尝试测试->
运算符,但我似乎无法做到这一点,因为当我执行以下程序并使用流馈送输入时,程序停止工作。
注意1:我在编译前收到警告,它说:
格式 '%s' 需要类型为"char *"的参数,但参数 2 的类型为 'int' [-wformat=]
注意2:如果我省略printf("%sn", *(&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("%sn", home1.name ) ;
printf("%sn", *(&home1)->name ) ;
return 0 ;
}
删除*
它就可以了。您的代码*(&home1)->name
类似于*(home1.name)
例如,它不是将指针传递给第一个字符,而是传递name
中第一个char
的值;由于默认参数升级,该值将转换为int
。
因此:
printf("%sn", (&home1)->name );
应该工作; 但是您不需要->
这里;->
现在只是更方便地使用指向结构的指针的快捷方式;即(*ptr).name
成更可口的ptr->name
;由于home
已经是一个struct
,而不仅仅是一个指向结构的指针,因此您应该改用.
。
你只需要删除*
(即不取消引用):
printf("%sn", (&home1)->name );
成员name
是一个数组,当传递给printf()
时,它被转换为指针(char*
)。但是,当您取消引用它时,它只是您传递的单个char
。 显然,它与printf()
对格式的期望不匹配%s
.
参见:什么是阵列衰减?
运算符->
和.
是可以互换的:
obj.field
与(&obj)->field
相同ptr->field
与(*ptr).field
相同
请注意,您已在(&home1)->name
的结果中添加了一个星号,这将生成一个char
。由于printf
是一个变量参数函数,因此char
在调用期间被提升为int
,从而解释警告。
当您为需要指针的参数传递int
时,会发生未定义的行为;在您的情况下,程序崩溃。删除取消引用运算符*
将解决此问题。
(&home1)->name
是成员数组。*(&home1)->name
是对成员数组的取消引用,由于数组衰减,它等效于(&home1)->name[0]
。这具有类型char
。通过可变参数函数(如printf
)的...
传递char
会将其提升为int
(...
会导致应用默认参数提升)。