如何使用允许我访问结构字段的结构来测试 -> 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 应用)。