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

时间:2017-02-17 09:29:59

标签: c pointers dereference

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

注意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 ;
}

4 个答案:

答案 0 :(得分:5)

删除>>> name = input("Would you please enter your name: ") ;\ ... age = int(input("Would you please enter your age: ")) Would you please enter your name: NicolausCopernicolaus Would you please enter your age: 29 >>> name 'NicolausCopernicolaus' >>> age 29 然后就可以了。您的代码*类似于*(&home1)->name,例如而不是将指针传递给第一个字符,它传递*(home1.name)中第一个char的值;由于默认参数促销,该值将转换为name

因此:

int

应该工作;但是你在这里不需要printf("%s\n", (&home1)->name ); ; ->现在只是更方便地使用指针结构的快捷方式;即->成更可口的(*ptr).name;由于ptr->name已经是home,而不仅仅是指向struct的指针,因此您应该使用struct

答案 1 :(得分:4)

您只需要放弃*(即不取消引用):

printf("%s\n", (&home1)->name );

成员name是一个数组,在传递给char*时会转换为指针(printf())。但是,当您取消引用它时,它只会传递一个char。 显然,它与printf()对格式%s的期望值不匹配。

请参阅:What is array decaying?

答案 2 :(得分:4)

运营商->.可以互换:

  • obj.field(&obj)->field
  • 相同
  • ptr->field(*ptr).field
  • 相同

请注意,您已为(&home1)->name的结果添加了星号,这会生成char。由于printf是一个变量参数函数,char在调用期间会被提升为int,并解释警告。

当您为期望指针的参数传递int时,会发生未定义的行为;在你的情况下,程序崩溃。删除解除引用运算符*将解决此问题。

答案 3 :(得分:4)

(&home1)->name是成员数组。 *(&home1)->name是成员数组的解除引用,因为数组衰减等同于(&home1)->name[0]。这个类型为char。将char传递到...变量函数printf,将其int推广到...main.js会导致default argument promotions。< / p>