C中的结构数组,告诉我我的成员不在结构或联合中

时间:2013-03-24 00:38:54

标签: c arrays function pointers struct

C新手在这里。我一直在寻找论坛,似乎无法得到我需要的帮助。 我想做的很简单。我在我的标题中声明了一个结构,然后我创建了一个这种结构的数组。

然后我调用一个函数,传入一个指向这个结构数组的指针,但是在函数中我得到了错误:

  

错误:请求会员' XXXXX'在不是结构或联合的东西中

我相信这个错误是我将结构数组传递给函数的方式,但我似乎无法找到正确的方法。

我的header.h如下:

#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED

typedef struct PhoneNumber
{
    char name[40];
    unsigned char number[10];

} PhoneNumber;


#endif // HEADER_H_INCLUDED

我还没有真正完成我的显示功能,我的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int main()
{
struct PhoneNumber PhoneNumbers[10];

//input phone number
inputPhoneNumbers(&PhoneNumbers);

//display PhoneNumber
displayPhoneNumbers(&PhoneNumbers);

return EXIT_SUCCESS;
}



int inputPhoneNumbers(int size, PhoneNumber *details[size])
{
    size = 0;
    printf("Enter a name\n");
    scanf("%s\n", &details[size].name);
    printf("Enter %s's number\n", details[size]->name);
    scanf("%s\n", &details[size].number);



   return EXIT_SUCCESS;
}


int displayPhoneNumbers(PhoneNumber *number)
{
    printf("%s\n",number->name);
    printf(number->number);

}

有人能指出我正确的方向吗?

干杯!

3 个答案:

答案 0 :(得分:3)

符号需要保持一致。你有:

scanf("%s\n", &details[size].name);
printf("Enter %s's number\n", details[size]->name);
scanf("%s\n", &details[size].number);

我认为应该是:

scanf("%s\n", details[size]->name);
printf("Enter %s's number\n", details[size]->name);
scanf("%s\n", details[size]->number);

然而,还有许多其他问题,我仍在努力。


这是单个文件SSCCE(Short, Self-Contained, Correct Example)。

#include <stdio.h>
#include <stdlib.h>

typedef struct PhoneNumber
{
    char name[40];
    unsigned char number[10];
} PhoneNumber;

int inputPhoneNumbers(int size, PhoneNumber details[size]);
void displayPhoneNumbers(PhoneNumber *number);

int main(void)
{
    struct PhoneNumber PhoneNumbers[10];

    inputPhoneNumbers(10, PhoneNumbers);

    displayPhoneNumbers(PhoneNumbers);

    return EXIT_SUCCESS;
}

int inputPhoneNumbers(int size, PhoneNumber details[size])
{
    size = 0;
    printf("Enter a name\n");
    scanf("%s\n", details[size].name);
    printf("Enter %s's number\n", details[size].name);
    scanf("%s\n", details[size].number);

    return EXIT_SUCCESS;
}

void displayPhoneNumbers(PhoneNumber *number)
{
    printf("%s\n", number->name);
    printf("%s\n", number->number);
}

此处的主要变化是inputPhoneNumbers()功能的类型更改;你想传递一个PhoneNumber数组,而不是一个指向PhoneNumber的指针数组。这意味着一致的表示法使用.而不是->

答案 1 :(得分:1)

更改int inputPhoneNumbers(int size, PhoneNumber *details[size])

int inputPhoneNumbers(int size, PhoneNumber *details)

并像这样称呼它 inputPhoneNumbers(10,PhoneNumbers);

答案 2 :(得分:0)

这是一种让你迷惑的尝试(希望不会让自己感到困惑)。同样,Jonathan指出,要保持一致,我会尝试使用最简单的表示法。

访问结构

PhoneNumber a;
printf("%s", a.name); // Note a.name is a char pointer to the first byte of name

通过指针

PhoneNumber *a;
printf("%s", a->name); // Uninitialized pointer, would need allocation

结构数组

PhoneNumber a[10];
printf("%s", a[0].name);
printf("%s", (a+0)->name); // note a is a PhoneNumber pointer to the a[0]

指向结构的指针数组

PhoneNumber *a[10];
printf("%s", a[0]->name); // Note a[0] is an uninitialized pointer
printf("%s", (*a[0]).name); // One would need to allocate storage

指向结构数组的指针

PhoneNumber (*a)[10];
printf("%s", (*a)[0].name);
printf("%s", a[0][0].name);
// Sometimes, when you have the right address, you can simply cast:
printf("%s", ((PhoneNumber*)a)->name);

以下是您可能想要做的事情:

int main()
{
   struct PhoneNumber PhoneNumbers[10]; // Array of structs, contiguous in memory

   //input phone number
   inputPhoneNumbers(PhoneNumbers); // Pass a pointer to the first element

   //display PhoneNumber
   displayPhoneNumbers(PhoneNumbers);

   return EXIT_SUCCESS;
}


int inputPhoneNumbers(int size, PhoneNumber *details) // Take a pointer to a PhoneNumber
{
   /// ...
}