【问题标题】:C programming : dereferencing pointersC 编程:取消引用指针
【发布时间】:2018-05-20 20:55:27
【问题描述】:

我有这三个文件。使用结构、函数和指针。

尝试这样做:

void getName(Name *) - 接收指向名称的指针并执行操作

联系人.h

struct Name {
char firstName[31];
char middleInitial[7];
char lastName[36];
};
struct Contacts {
struct Name name;
struct Address address;
struct Numbers numbers;
};
void getName(struct Name*name);

联系人.c

#include <stdio.h>
#include "contacts.h"

void getName(struct Name*name)
{
    char yorn;
        printf("Please enter the contact's first name: ");
scanf("%s", name->firstName);

printf("Do you want to enter a middle initial(s)? (y or n): ");
scanf("%s", &yorn);

if (yorn == 'y'){
    printf("Please enter the contact's middle initial(s): ");
    scanf("%s", name->middleInitial);
}

printf("Please enter the contact's last name: ");
scanf("%s", name->lastName);
}

a1ms4.c

#include <stdio.h>
#include "contacts.h"
#include "contacts.c"

struct Name name;
getName(&contact.name);

我在 contacts.c 中收到以下错误:

错误:取消引用指向不完整类型结构名称的指针

scanf("%s", name-&gt;firstName);

                 ^~

[编辑: 我将代码最小化为:

#include <stdio.h>

struct Name {
char firstName[31];
};

struct Contacts {

struct Name name;
};

void getName(Name*name);

int main(void)
{

struct Contacts contact;
getName(&contact.name);
return 0;
}

void getName(Name*name)
{
char yorn;
printf("Please enter the contact's first name: ");
scanf("%c", name->firstName);

printf("First name: %c\n", name.firstName);

return;
}

并得到这些错误:

1)。错误:未知类型名称âNameâ

void getName(Name*name);

2)。在函数âmainâ:

警告:函数âgetNameâ的隐式声明;你的意思是âgetlineâ? [-Wimplicit-function-declaration]

getName(&amp;contact.name);

3)。顶层:

错误:未知类型名称âNameâ

void getName(Name*name)

【问题讨论】:

  • 不要包含*.c 文件!曾经。直到您成为专业人士并确切地知道自己在做什么。
  • 这是一个作业,他们希望我们包含所有三个文件
  • 他们不可能问这样的事情。如果他们是 - 我会重新考虑在这个地方学习 C。
  • @SaM Eugene 是对的,永远不应该包含 c 文件。 c 文件应该被编译和链接(从这个意义上说,包含在你的输出可执行项目中)
  • 您认为使用scanf("%s"char 变量地址是个好主意吗?仔细阅读 scanf 的工作原理......

标签: c function pointers struct


【解决方案1】:

当您在 C 中说 struct Foo {...}; 时,您并没有定义名称为 Foo 的类型。相反,您通过名称 Foo ** 定义了一个 struct,它被引用为 struct Foo

因此,当您说void getName(Name*name); 时,您的编译器正确地抱怨没有称为Name 的类型。由于它无法解析此函数声明,因此它随后会抱怨在您调用它时不知道该函数。忽略第二个错误,这不是你的问题。修复原型。


修复程序有两种方法:

  1. 调用你的结构struct。在代码中包含Name 的每个实例中,请确保您实际上是在说struct Name

  2. 写一个typedef 来定义Name 的类型。像这样声明你的结构:

    struct Foo { ... };
    typedef struct Foo Foo;
    

    由于 C 程序员是懒惰的 git,他们通常会将这两条语句合并到以下声明中:

    typedef struct Foo { ... } Foo;
    

    这在单个语句中声明了struct Foo 及其别名Foo。你会在实际代码中看到很多。


typedef 的形式值得解释一下。我发现最容易将其视为带有typedef 的变量声明,以将变量名称转换为类型名称。 IE。如果你可以用

声明一个字符串数组
char* array[10];

然后你可以给它的类型命名

typedef char* ArrayType[10];

之后,你可以用一个简单的声明上面的数组

ArrayType array;

所以,当你说

typedef struct Foo Foo;

第二个Foo 是要声明的名称,它的别名类型是声明的其余部分,没有typedefstruct Foo

【讨论】:

  • 是的,我明白了,谢谢它修复了未知类型的错误。我将struct 放在函数中的名称之前。非常感谢您的帮助
  • 它给出了错误:请求成员 firstName 不是结构或联合
  • @SaM 啊,忽略了这个错误:当firstName 是一个指针(用struct Name* firsName 声明)时,你不能使用. 操作符来访问它的成员。您必须改用取消引用 -&gt; 运算符。
  • 现在我要试着分别放在*.h*.cmain
【解决方案2】:

有很多问题,但我认为您的主要错误是您已将Name 声明为struct Name,因此您需要使用struct Name 而不仅仅是Name

【讨论】:

  • 是的,我把 Struct 放在名称之前,它现在可以工作了。谢谢你的帮助。有这个新错误:请求成员 firstName 不是结构或联合
  • 我把每个代码都放在了适当的位置(*.h*.cmain),现在我在头文件中遇到两种错误,一种是与 get* 冲突的类型,第二种是重新定义结构 *
【解决方案3】:

取消引用指针意味着使用 * 运算符来访问存储在指针处的值。但请记住,存储在指针地址处的值必须是与指针“指向”的变量类型相同的值,但除非指针设置正确,否则不能保证这种情况.

【讨论】:

    猜你喜欢
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多