gpt4 book ai didi

C迭代结构坏数据

转载 作者:太空宇宙 更新时间:2023-11-04 07:01:50 26 4
gpt4 key购买 nike

我在 while 循环中向我的结构添加值。

struct person
{
char * name;
char * surname;
int age;
char * email;
};
struct person * tablicaOsob[100];

//for loop
tablicaOsob[i] = createPerson(name, surename, age, email);

数据已正确添加。我通过调试器检查这个

enter image description here

现在我想遍历 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 *));

你只是为“指向对象的指针”的大小分配内存,而不是为“对象”本身的大小分配内存。你应该写

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. .

关于C迭代结构坏数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37132890/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com