【问题标题】:allocating memory with malloc()使用 malloc() 分配内存
【发布时间】:2016-10-24 14:45:33
【问题描述】:

在下面的程序中,我试图通过调用 malloc() 来创建函数 insert() 来分配内存以创建一个新的结构(人)...但是我收到以下警告:分配来自不兼容的指针类型 [启用默认情况下]...我应该如何使用 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;
}

【问题讨论】:

标签: c pointers malloc dynamic-memory-allocation


【解决方案1】:

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

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

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

删除malloc 即可解决问题。

【讨论】:

  • 将 malloc() 与 Visual C++ 或 Builder C++ 编译器一起使用时,如果结果值未使用指针类型强制转换,我总是会收到错误消息。 Visual C++ 6.0:error C2440: '=' : cannot convert from 'void *' to '&lt;Xxxx&gt; *'。生成器 C++ XE10:E2034 Impossible de convertir 'void *' en '&lt;Xxxx&gt; *'.
  • @J.Piquard 如果您使用的是 C++ 编译器,那么是的,您需要转换结果。但是,对于 C 编译器,您不应该这样做。
【解决方案2】:

仔细查看您的代码。

person people[7];

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

也就是说,如果你想要动态分配,那么,你需要 person 是一个包含 7 个指针变量的数组以键入 person,并且你可以为 insert() 函数内的单个指针分配内存。像person *people[7]; 这样的东西可以在那里使用。此外,您需要包含stdlib.h 才能拥有malloc() 和家庭的原型。这就是why not to cast the return value of malloc() and family in C. 的原因之一。

这样,你的函数原型也会改变。你必须

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

【讨论】:

  • 我必须将此程序作为 uni 的作业...并且在任务中说要在 insert() 函数中使用 malloc()...
  • @RalucaDamarisLupeş 我已经更新了答案,看看是否有帮助。
  • 使用 -> 打印单个元素的语法是什么?
  • 我尝试了您的建议,但收到 2 个错误
  • @RalucaDamarisLupeş people[i]-&gt;name 等等。
【解决方案3】:

您可以尝试这样的方法,但这实际上取决于您收集数据的方式。但是对于您描述的数组,这种方式是可能的。

虽然,对于您已声明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);
}

【讨论】:

  • @Raluca Damaris Lupeş 这有帮助吗?
猜你喜欢
  • 2013-02-23
  • 2012-12-26
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2020-11-01
  • 2018-06-06
  • 2013-11-20
相关资源
最近更新 更多