如何在C中声明指向struct的指针数组然后使用它?

时间:2015-10-25 23:39:59

标签: c arrays struct

我的目标是声明一个指向我的人物结构的指针数组,然后用它来修改人物的名称和年龄。我的代码很丢失,所以任何帮助都会受到赞赏。谢谢!!! / p>

#include <stdio.h>

#define HOW_MANY 7

char *names[HOW_MANY]= {"p1", "p2", "p3", "p4", "p5", "p6", "p7"};

int ages[HOW_MANY]= {2, 1, 16, 8, 10, 3, 4};

struct person
{
    char person_name[30];
    int person_age;
}*array[10];

static void insert(struct person array[], char *name, int age) 
{
    static int nextfreeplace = 0;
    array[nextfreeplace] = (struct person*) malloc(sizeof(struct person));
    &array[nextfreeplace]->person_name = name;
    &array[nextfreeplace]->person_age = age;
    nextfreeplace++;  
}

int main(int argc, char **argv) 
{ 
    struct person *array[10];
    int index;
    int personNumber = 1;

    for (index = 0; index < HOW_MANY; index++) 
    {
        insert (array[index], names[index], ages[index]);
    }


    for (index = 0; index < HOW_MANY; index++)
    {
        printf("\nPerson number %d has name %s and age %d \n", personNumber,
             array[index]->person_name, array[index]->person_age);
        personNumber++;
    }

    return 0;
}

我得到的错误:

arrays.c: In function ‘insert’:
arrays.c:20: warning: implicit declaration of function ‘malloc’
arrays.c:20: warning: incompatible implicit declaration of built-in 
function   ‘malloc’
arrays.c:20: error: incompatible types when assigning to type 
‘struct   person’ from type ‘struct person *’
arrays.c:21: error: invalid type argument of ‘->’ (have ‘struct person’)
arrays.c:22: error: invalid type argument of ‘->’ (have ‘struct person’)
make: *** [arrays] Error 1

1 个答案:

答案 0 :(得分:1)

您已在此处成功声明了指向结构的指针数组

  struct person *array[10];

然后,您需要分配内存,以使此数组中的每个指针实际指向结构的实例

目前您已通过

array[index]

insert作为第一个参数,但array[index]的类型为person*,但您的insert函数需要person []

您尝试在array[nextfreeplace]函数中访问insert,但当您将person*传递给insert时,这将尝试读取可能不存在的内存地址有效,因为

array[nextfreeplace] = (struct person*) malloc(sizeof(struct person));

相同
*(array + nextfreeplace) = (struct person*) malloc(sizeof(struct person));

所以只要nextfreeplace非零,你就会有效地尝试分配动态内存并将指针存储在一个你不应该的地址。

这会导致潜在的未定义行为。你不能把array里面的指针看作是有自己的数组(除非你分配足够的内存并将它们视为这样 - 你的代码不是这种情况)。您当然会将malloc的返回值存储到此指针偏移处的地址。正如你的代码所代表的那样,每个array[index]都不是一个你可以自由阅读和写入的数组,不应该被视为没有预期的问题。

您可以考虑将insert更改为

void insert(struct person** p, char *name, int age) 
{
    *p = malloc(sizeof(struct person));
} 

然后将main中的循环更改为

for (index = 0; index < HOW_MANY; index++) 
{
    insert (&array[index], names[index], ages[index]);
}