C迭代结构坏数据
C iterate over struct bad data
我在 while 循环中为我的结构添加值。
struct person
{
char * name;
char * surname;
int age;
char * email;
};
struct person * tablicaOsob[100];
//for loop
tablicaOsob[i] = createPerson(name, surename, age, email);
数据已正确添加。我通过调试器检查这个
现在我想遍历 tablicaOsob
我创建函数
void list_persons(struct person *p, int k)
{
printf("Lista osob\n");
int i;
for(i=0; i<k; i++)
{
printf("%s\n", p[i].name );
}
}
但是当我启动这个函数时:list_persons(&tablicaOsob,i);
我得到了一些错误的数据。问题出在哪里。我的编译器说:
main.c:74:17: warning: passing argument 1 of 'list_persons' from incompatible pointer type [enabled by default]
list_persons(&tablicaOsob,i);
^
main.c:17:6: note: expected 'struct person *' but argument is of type 'struct person * (*)[100]'
void list_persons(struct person *p, int k)
编辑:
createPerson()
struct person * createPerson(char * name, char * surename, int age, char * email)
{
struct person * p = (struct person *) malloc(sizeof(struct person *));
p->name = name;
p->surname = surename;
p->email = email;
p->age = age;
return p;
}
是的,内存分配中的问题。您为 p
分配的内存比它需要的要少。之后,访问返回的指针会导致内存访问越界,进而调用 undefined behavior.
在您的代码中,
struct person * p = (struct person *) malloc(sizeof(struct person *));
您只为 "pointer to object" 的大小分配内存,而不是 "object" 本身的大小。你应该写
struct person * p = malloc(sizeof(struct person));
或者,为了更好
struct person * p = malloc(sizeof*p);
此外,在调用函数时,您应该传递一个指向结构的指针,例如
list_persons(tablicaOsob[0],i); //tablicaOsob[0]is of type struct person *
应该可以完成这项工作,只要 i
值不会导致越界访问。
也就是说,Please see this discussion on why not to cast the return value of malloc()
and family in C
.。
struct person * p = (struct person *) malloc(sizeof(struct person *));
这是错误的,您要为 struct
保留 space,而不是指向此 struct
的指针。
改为
struct person *p = malloc(sizeof(struct person)); /* Don't cast malloc */
或
struct person *p = malloc(sizeof(*person));
这也是错误的:
list_persons(&tablicaOsob,i);
list_persons
期待一个指针,而 tablicaOsob
是一个指针数组,不要将指针数组的地址传递给单个指针,传递他的值或简单地传递第一个元素。
list_persons(*tablicaOsob,i);
您的 createPerson
函数完全错误。
正如 Alter Mann 和 Saurav 所提到的,您错误地执行了初始 malloc。
您还需要为指针 name
、suname
和 email
分配内存。这是在循环中分配多个人所必需的。您需要为每个字符数组分配 strlen(xxx) +1
的内存。
该函数将如下所示:
struct person * createPerson(char * name, char * surename, int age, char * email)
{
struct person * p = malloc(sizeof(struct person));
p->name = malloc(strlen(name)+1);
strcpy(p->name, name);
p->surname = malloc(strlen(surename)+1);
strcpy(p->surname, surename);
p->email = malloc(strlen(email)+1);
strcpy(p->email, email);
p->age = age;
return p;
}
我在 while 循环中为我的结构添加值。
struct person
{
char * name;
char * surname;
int age;
char * email;
};
struct person * tablicaOsob[100];
//for loop
tablicaOsob[i] = createPerson(name, surename, age, email);
数据已正确添加。我通过调试器检查这个
现在我想遍历 tablicaOsob
我创建函数
void list_persons(struct person *p, int k)
{
printf("Lista osob\n");
int i;
for(i=0; i<k; i++)
{
printf("%s\n", p[i].name );
}
}
但是当我启动这个函数时:list_persons(&tablicaOsob,i);
我得到了一些错误的数据。问题出在哪里。我的编译器说:
main.c:74:17: warning: passing argument 1 of 'list_persons' from incompatible pointer type [enabled by default]
list_persons(&tablicaOsob,i);
^
main.c:17:6: note: expected 'struct person *' but argument is of type 'struct person * (*)[100]'
void list_persons(struct person *p, int k)
编辑:
createPerson()
struct person * createPerson(char * name, char * surename, int age, char * email)
{
struct person * p = (struct person *) malloc(sizeof(struct person *));
p->name = name;
p->surname = surename;
p->email = email;
p->age = age;
return p;
}
是的,内存分配中的问题。您为 p
分配的内存比它需要的要少。之后,访问返回的指针会导致内存访问越界,进而调用 undefined behavior.
在您的代码中,
struct person * p = (struct person *) malloc(sizeof(struct person *));
您只为 "pointer to object" 的大小分配内存,而不是 "object" 本身的大小。你应该写
struct person * p = malloc(sizeof(struct person));
或者,为了更好
struct person * p = malloc(sizeof*p);
此外,在调用函数时,您应该传递一个指向结构的指针,例如
list_persons(tablicaOsob[0],i); //tablicaOsob[0]is of type struct person *
应该可以完成这项工作,只要 i
值不会导致越界访问。
也就是说,Please see this discussion on why not to cast the return value of malloc()
and family in C
.。
struct person * p = (struct person *) malloc(sizeof(struct person *));
这是错误的,您要为 struct
保留 space,而不是指向此 struct
的指针。
改为
struct person *p = malloc(sizeof(struct person)); /* Don't cast malloc */
或
struct person *p = malloc(sizeof(*person));
这也是错误的:
list_persons(&tablicaOsob,i);
list_persons
期待一个指针,而 tablicaOsob
是一个指针数组,不要将指针数组的地址传递给单个指针,传递他的值或简单地传递第一个元素。
list_persons(*tablicaOsob,i);
您的 createPerson
函数完全错误。
正如 Alter Mann 和 Saurav 所提到的,您错误地执行了初始 malloc。
您还需要为指针
name
、suname
和email
分配内存。这是在循环中分配多个人所必需的。您需要为每个字符数组分配strlen(xxx) +1
的内存。
该函数将如下所示:
struct person * createPerson(char * name, char * surename, int age, char * email)
{
struct person * p = malloc(sizeof(struct person));
p->name = malloc(strlen(name)+1);
strcpy(p->name, name);
p->surname = malloc(strlen(surename)+1);
strcpy(p->surname, surename);
p->email = malloc(strlen(email)+1);
strcpy(p->email, email);
p->age = age;
return p;
}