【问题标题】:In C : how to pass an array of structures as a pointer [duplicate]在C中:如何将结构数组作为指针传递[重复]
【发布时间】:2012-09-29 21:18:26
【问题描述】:

可能重复:
How to pass an array of struct using pointer in c/c++?

我有一个结构数组,需要将指向该数组的指针传递给函数。

我收到这些编译警告,它在运行时崩溃:

test.c:35:5:警告:从不兼容的指针类型传递“displayArray”的参数 1
test.c:20:6: 注意:预期 ‘struct tagdata **’ 但参数类型为 ‘struct tagdata (*)[10]’

typedef struct tagdata{
    char lastName[20];
    char firstName[20];
    int age;
} PERSON[10], *PPERSON[];

int genNumber();
void displayArray(PPERSON pPerson);

int main(){
    PERSON personDetails;
    int i;
    char buf[20];

    for (i = 0; i < 10; i++){
        sprintf(buf, "Charlie%d", i);
        strcpy(personDetails[i].firstName, buf);
        sprintf(buf, "Brown - %d", i);
        strcpy(personDetails[i].lastName, buf);
        personDetails[i].age = genNumber();
    }

    displayArray(&personDetails);

    exit(0);
}
void displayArray(PPERSON pPerson){
    int i = 0;

    while (i < 10){
        printf("Last Name   First Name  Age\n");
        printf("%s          %s          %d\n",
               pPerson[i]->lastName,
               pPerson[i]->lastName,
               pPerson[i]->age);
        i++;
    }
}
int genNumber(){
    int n;
    n=random();

    return(n);
}

【问题讨论】:

  • 您在崩溃时收到什么信息?
  • ./test Last Name First Name Age Segmentation fault (core dumped)
  • 你把事情复杂化了。您只是将数组传递给函数。数组中的内容无关紧要。查看 any example 将数组传递给函数。
  • 在您发布的代码 sn-p 中实际上是第 23 行 (±2) 时,发布有关第 35 行的错误消息并不好,除非您确定第 35 行。您应该丢失 @ displayArray(&amp;personDetails); 中的 987654326@ — 数组的地址与指向数组第一个元素的指针的类型不同(即使地址的数值相同)。这就是编译器告诉你的。通常,数组和指针的 typedef 会使事情变得更加混乱。有一个 typedef,比如说,Person 的结构是有意义的。尽可能多地使用它。但不是PERSON[10] 等。
  • @JonathanLeffler 至少应将其中的一部分复制到此问题的新答案中。

标签: c pointers structure


【解决方案1】:

我有一个也是数组的结构

虽然没有“结构也是数组”这样的东西,但您可以创建一个结构数组。您应该首先解开typedefstruct 变量的声明,如下所示:

typedef struct {
    char lastName[20];
    char firstName[20];
    int age;
} PERSON; 

PERSON person[10];

现在您可以使用PERSON 作为类型名称,声明PERSON 类型的变量,创建指向它们的指针,传递数组等等,就好像它是一个内置类型的值一样,比如int:

void displayArray(PERSON pPerson[], int count) {
    int i = 0;

    printf("Last Name   First Name  Age\n");
    while (i < count){
        printf("%s          %s          %d\n",
               pPerson[i].lastName,
               pPerson[i].lastName,
               pPerson[i].age);
        i++;
    }
}

【讨论】:

  • +1 用于拆分typedef。我打算提出相同的建议,因为我发现它(发布的代码)非常难以阅读。
【解决方案2】:

您应该传递一个 void 指针并将其强制转换为 PERSON[10]。

如您所见,您没有将指针传递给 PERSON 结构,而是将指针传递给本身包含该结构的数组。它们不相等。

要使其正常工作,请传递一个 void 指针和一个表示数组中元素数量的整数。当您收到它时,它将帮助您避免读取超出其分配内存的数组。

【讨论】:

  • 不,你绝对不应该使用空指针。这只会导致问题,因为您会失去任何类型安全性。
【解决方案3】:

大致写成: ** 随便 = * 随便[10]

所以你可能只是想要 *个人

【讨论】:

    【解决方案4】:

    数组可以作为指针传递给函数,因此不要尝试作为指向数组的指针传递(顺便说一下,现在PPERSON 被定义为指针数组,这不是你所拥有的)只需按原样传递数组,并使PPERSON 成为普通指针(即typedef struct tagdata *PPERSON;)。

    那么就可以在函数中使用“指针”作为普通数组了。

    【讨论】:

      【解决方案5】:

      *个人[];这是你真的想要用户还是 你想要这样的东西: typedef PERSON *PPERSON;

      【讨论】:

        猜你喜欢
        • 2020-12-14
        • 2019-04-22
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-22
        • 2013-09-02
        • 1970-01-01
        相关资源
        最近更新 更多