在下面的程序中,我试图让函数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;
}
答案 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);
}