[英]can I access a struct inside of a struct without using the dot operator?
[英]How can I test the -> C operator using a struct that allows me to access a struct's field?
我正在尝试测试->
运算符,但似乎无法做到这一点,因为当我执行以下程序并向输入流提供输入时,该程序将停止工作。
注意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 ;
}
删除*
。 您的代码*(&home1)->name
与*(home1.name)
类似,例如,它没有将指针传递给第一个字符,而是传递了name
第一个char
的值; 由于默认的参数提升,该值将转换为int
。
从而:
printf("%s\n", (&home1)->name );
应该管用; 但是,您不需要->
在这里; ->
现在只是更方便地使用指向结构的指针的快捷方式; 即(*ptr).name
成为更可口的ptr->name
; 由于home
已经是一个struct
,而不仅仅是指向该结构的指针,因此您应该使用.
代替。
您只需要删除*
(即不取消引用):
printf("%s\n", (&home1)->name );
成员name
是一个数组,当传递给printf()
时,该数组将转换为指针( char*
printf()
。 但是,当取消引用它时,它只是传递的一个char
。 显然,它与printf()
对%s
格式的期望不匹配。
请参阅: 什么是阵列衰减?
运算符->
和.
可以互换:
obj.field
与(&obj)->field
ptr->field
与(*ptr).field
ptr->field
相同 请注意,您已经在(&home1)->name
的结果中添加了一个星号,这会产生一个char
。 由于printf
是变量参数函数,因此在调用过程中char
被提升为int
,从而解释了警告。
当为需要指针的参数传递int
值时,会发生未定义的行为; 在您的情况下,程序崩溃。 删除取消引用运算符*
将解决此问题。
(&home1)->name
是成员数组。 *(&home1)->name
是成员数组上的取消引用,由于数组衰减,该引用等效于(&home1)->name[0]
。 此类型为char
。 传递一个char
通过...
一个可变参数函数如printf
促进它int
( ...
使默认参数促销活动适用)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.