在C中:如何将结构数组作为指针传递

时间:2012-10-09 13:59:40

标签: c pointers structure

  

可能重复:
  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);
}

5 个答案:

答案 0 :(得分:7)

  

我的结构也是数组

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

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

PERSON person[10];

现在你可以使用PERSON作为类型的名称,声明类型PERSON的变量,指向它们的指针,传递数组等等,就像它是一个内置的值一样-in类型,例如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 :(得分:0)

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

如您所见,您没有将指针传递给PERSON stuct,而是将指针传递给一个本身包含结构的数组。他们不平等。

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

答案 2 :(得分:0)

大致写道: **无论如何= *无论[10]

所以你可能只想要 * PPerson

答案 3 :(得分:0)

一个数组可以作为指针传递给函数,所以不要试图作为指向数组的指针传递(顺便说一下,现在PPERSON被定义为一个指针数组,这不是你的意思必须按原样传递数组,并使PPERSON成为普通指针(即typedef struct tagdata *PPERSON;)。

然后你可以在函数中使用“指针”作为普通数组。

答案 4 :(得分:0)

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