如何使用允许我访问结构字段的结构来测试 -> C 运算符?
How can I test the -> C operator using a struct that allows me to access a struct's field?
我正在尝试测试 ->
运算符,但我似乎做不到,因为当我执行以下程序并使用流提供输入时,程序停止工作。
注意1:我在编译前得到一个警告,它说:
format '%s' expects argument of type 'char *', but argument 2 has type
'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 ;
}
您只需删除 *
(即不取消引用):
printf("%s\n", (&home1)->name );
成员 name
是一个数组,在传递给 printf()
时会转换为指针 (char*
)。但是,当您取消引用它时,您传递的只是一个 char
。
显然,它与 printf()
对 %s
.
格式的期望不匹配
参见:What is array decaying?
删除 *
即可。您的代码 *(&home1)->name
类似于 *(home1.name)
例如它不是将指针传递给第一个字符,而是传递 name
中第一个 char
的值;由于默认参数提升,该值被转换为 int
.
因此:
printf("%s\n", (&home1)->name );
应该可以;但是这里不需要 ->
; ->
现在只是更方便地使用 pointer-to-structs 的快捷方式;即 (*ptr).name
变成更可口的 ptr->name
;因为 home
已经是一个 struct
而不仅仅是指向结构的指针,您应该改用 .
。
运算符 ->
和 .
可以互换:
obj.field
等同于 (&obj)->field
ptr->field
等同于 (*ptr).field
请注意,您在 (&home1)->name
的结果中添加了一个星号,它会生成 char
。由于 printf
是一个 variable-argument 函数,因此 char
在调用期间被提升为 int
,解释警告。
当您为需要指针的参数传递 int
时,会发生未定义的行为;在你的情况下,程序崩溃了。删除取消引用运算符 *
将解决此问题。
(&home1)->name
是成员数组。 *(&home1)->name
是对成员数组的取消引用,由于数组衰减等同于 (&home1)->name[0]
。这具有类型 char
。通过 printf
等可变函数的 ...
传递 char
将其提升为 int
(...
导致 default argument promotions 应用)。
我正在尝试测试 ->
运算符,但我似乎做不到,因为当我执行以下程序并使用流提供输入时,程序停止工作。
注意1:我在编译前得到一个警告,它说:
format '%s' expects argument of type 'char *', but argument 2 has type '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 ;
}
您只需删除 *
(即不取消引用):
printf("%s\n", (&home1)->name );
成员 name
是一个数组,在传递给 printf()
时会转换为指针 (char*
)。但是,当您取消引用它时,您传递的只是一个 char
。
显然,它与 printf()
对 %s
.
参见:What is array decaying?
删除 *
即可。您的代码 *(&home1)->name
类似于 *(home1.name)
例如它不是将指针传递给第一个字符,而是传递 name
中第一个 char
的值;由于默认参数提升,该值被转换为 int
.
因此:
printf("%s\n", (&home1)->name );
应该可以;但是这里不需要 ->
; ->
现在只是更方便地使用 pointer-to-structs 的快捷方式;即 (*ptr).name
变成更可口的 ptr->name
;因为 home
已经是一个 struct
而不仅仅是指向结构的指针,您应该改用 .
。
运算符 ->
和 .
可以互换:
obj.field
等同于(&obj)->field
ptr->field
等同于(*ptr).field
请注意,您在 (&home1)->name
的结果中添加了一个星号,它会生成 char
。由于 printf
是一个 variable-argument 函数,因此 char
在调用期间被提升为 int
,解释警告。
当您为需要指针的参数传递 int
时,会发生未定义的行为;在你的情况下,程序崩溃了。删除取消引用运算符 *
将解决此问题。
(&home1)->name
是成员数组。 *(&home1)->name
是对成员数组的取消引用,由于数组衰减等同于 (&home1)->name[0]
。这具有类型 char
。通过 printf
等可变函数的 ...
传递 char
将其提升为 int
(...
导致 default argument promotions 应用)。