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 函数完全错误。

  1. 正如 Alter Mann 和 Saurav 所提到的,您错误地执行了初始 malloc。

  2. 您还需要为指针 namesunameemail 分配内存。这是在循环中分配多个人所必需的。您需要为每个字符数组分配 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;

}