如何使用允许我访问结构字段的结构测试 -> C 运算符?



我正在尝试测试->运算符,但我似乎无法做到这一点,因为当我执行以下程序并使用流馈送输入时,程序停止工作。

注意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(...会导致应用默认参数提升)。

相关内容

  • 没有找到相关文章

最新更新