繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM