使用malloc()分配内存

时间:2016-10-24 14:45:33

标签: c pointers malloc dynamic-memory-allocation

在下面的程序中,我试图让函数insert()通过调用malloc()来创建一个新的struct(person)来分配内存......但是我得到以下警告:从不兼容的指针类型赋值[默认启用] ...我应该如何使用malloc()函数?

#include <stdio.h>
/* these arrays are just used to give the parameters to 'insert',
   to create the 'people' array 
*/

#define HOW_MANY 7
char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim",
              "Harriet"};
int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24};

typedef struct
{
  char *name;
  int age;
}person;


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

int main(int argc, char **argv) 
{

  person people[7];

  for (int i = 0; i < 7; i++) 
  {
    insert (&people[i], names[i], ages[i]);
  }

  for (int i = 0; i < 7; i++) 
  {
    printf ("name: %s, age: %i\n", people[i].name, people[i].age);
  }
  return 0;
}

3 个答案:

答案 0 :(得分:4)

您将malloc的结果转换为struct person *,但p的类型为person *。它们不是同一件事。第一个是struct的标记名称(在这种情况下不存在),而另一个是typedef,其别名(在本例中)是未命名的struct

您实际上shouldn't be casting the result value of malloc因为这会导致其他错误。

此外,您根本不应该使用malloc。您传入person结构的地址,因此已经为其分配了内存(即作为main中的局部变量)。

摆脱malloc,这将解决问题。

答案 1 :(得分:1)

仔细查看您的代码。

person people[7];

people是一个包含person类型的7个元素的数组,其中所有元素在编译时都被分配内存(松散地说),不需要运行 - 时间分配在这里。首先,您不需要malloc()

那就是说,如果你想要动态分配,那么你需要person是一个包含person类型的7个指针变量的数组,你可以将内存分配给insert()内的单个指针。 {1}}功能。像person *people[7];这样的东西可以在那里使用。此外,您需要包含stdlib.h以获得malloc()和家人的原型。这是why not to cast the return value of malloc() and family in C.的原因之一。

这样,您的函数原型也将发生变化。你必须

  • 接受person **p
  • (*p)函数内的insert()上操作,最后
  • main()中,您必须在打印各个元素的值时使用指针成员引用运算符->

答案 2 :(得分:0)

你可以尝试这样的事情,但这实际上取决于你如何收集你的数据。但是对于你所描述的阵列,这种方式是可能的。

虽然,在特定情况下,您已宣布7人,但最好不要使用malloc()。如果您不知道会有多少人,那么malloc()是一个不错的选择。

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

#define HOW_MANY 7

typedef struct{
   char *name;
  int age;
}person_t;

typedef struct {
    person_t *person;
    int numpersons;
} all_person_t;

all_person_t *initialize_persons(void);
void insert(all_person_t *persons, char *name, int age, int count);
void print_persons(all_person_t *persons);
void insert_each_person(all_person_t *persons, char *names[], int ages[]);
void free_persons(all_person_t *persons);

int
main(int argc, char const *argv[]) {
    char *names[HOW_MANY]= {"Simon", "Suzie", "Alfred", "Chip", "John", "Tim", "Harriet"};
    int ages[HOW_MANY]= {22, 24, 106, 6, 18, 32, 24};

    all_person_t *persons;

    persons = initialize_persons();

    insert_each_person(persons, names, ages);

    print_persons(persons);

    free_persons(persons);

    return 0;
}

void
insert_each_person(all_person_t *persons, char *names[], int ages[]) {
    int i;

    persons->person = malloc(persons->numpersons *sizeof(person_t));

    for (i = 0; i < persons->numpersons; i++) {
        insert(persons, names[i], ages[i], i);
    }
}

all_person_t
*initialize_persons(void) {
    all_person_t *persons;
    persons = malloc(sizeof(*persons));
    persons->numpersons = HOW_MANY;
    return persons;
}

void
insert(all_person_t *persons, char *name, int age, int count) {
    persons->person[count].name = malloc(strlen(name)+1);

    strcpy(persons->person[count].name, name);
    persons->person[count].age = age;
}

void
print_persons(all_person_t *persons) {
    int i;

    for (i = 0; i < persons->numpersons; i++) {
         printf("%s %d\n", persons->person[i].name, persons->person[i].age);
    }
}

void
free_persons(all_person_t *persons) {
    int i;

    for (i = 0; i < persons->numpersons; i++) {
        free(persons->person[i].name);
    }
    free(persons->person);
    free(persons);
}