C数组在被函数修改后损坏

C数组在被函数修改后损坏,c,arrays,C,Arrays,我试图编写一个C程序,它收集所有传递特定条件到数组中的结构 #include <stdio.h> #include <stdlib.h> #include <string.h> struct Book { char title[20]; unsigned int published; char authors[50]; unsigned int pages; }; unsigned int get_books_from(unsigned i

我试图编写一个C程序,它收集所有传递特定条件到数组中的结构

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct Book {
  char title[20];
  unsigned int published;
  char authors[50];
  unsigned int pages;
};

unsigned int get_books_from(unsigned int year, int length, struct Book data[], struct Book results[]);

int main(int argc, char* argv[]) {
  struct Book data[5];

  // Init book pool inside data

  struct Book books[0];
  unsigned int books_count = get_books_from(1973, 5, data, books);

  return 0;
}

unsigned int get_books_from(unsigned int year, int length, struct Book data[], struct Book results[]) {
  results = (struct Book*) malloc(sizeof(struct Book));
  unsigned int results_count = 0;

  int i;
  for (i = 0; i < length; i++) {
    if (data[i].published == year) {
      *(results + results_count) = data[i];

      results = (struct Book*) realloc(results, (++results_count + 1) * sizeof(struct Book));
    }
  }

  return results_count;
}
#包括
#包括
#包括
结构书{
字符标题[20];
未签名整数已发布;
char作者[50];
无符号整型页;
};
unsigned int get_books_from(unsigned int year,int length,struct Book data[],struct Book results[]);
int main(int argc,char*argv[]){
结构书数据[5];
//初始化书池内部数据
结构图书[0];
unsigned int books_count=从(1973,5,数据,books)中获取书籍;
返回0;
}
unsigned int get_books_from(unsigned int year,int length,struct Book data[],struct Book results[]){
结果=(结构书*)malloc(结构书的大小);
无符号整数结果\u计数=0;
int i;
对于(i=0;i

逻辑似乎工作正常,但是当尝试访问
books
数组内容时,在
get\u books\u from
函数(称为
results
)之外,所有数据都会损坏。一些原始数据仍然存在,但不在正确的位置,看起来好像数据被移动了。我检查了
书籍
结果
的指针,这些变量似乎在函数完成后没有指向内存中的相同位置。有什么问题吗?

您的
获取书籍
更改
结果的值,如下所示:

  results = (struct Book*) realloc(results, (++results_count + 1) * sizeof(struct Book));
但它无法让调用者获得
结果的新值


更糟糕的是,您使用
data
调用
get\u books\u from
,这是在
main
中的堆栈上分配的。您不能
realloc
it。正如
realloc
的文档所述,您试图重新分配的指针必须通过先前调用
malloc
calloc
realloc
返回。幸运的是,您忽略了该值。但这会呈现
struct Book数据[5]
main
中无法理解。为什么要在堆栈上分配空间?

您的
get\u books\u from
在此处更改
结果的值:

  results = (struct Book*) realloc(results, (++results_count + 1) * sizeof(struct Book));
但它无法让调用者获得
结果的新值


更糟糕的是,您使用
data
调用
get\u books\u from
,这是在
main
中的堆栈上分配的。您不能
realloc
it。正如
realloc
的文档所述,您试图重新分配的指针必须通过先前调用
malloc
calloc
realloc
返回。幸运的是,您忽略了该值。但这会呈现
struct Book数据[5]
main
中无法理解。为什么要在堆栈上分配空间?

除了另一个答案外:

您可能需要这样的代码(未经测试、无错误检查的代码、声明和#包含ommited以简洁明了):

unsigned int get_books_from(unsigned int year,int length,struct Book data[],struct Book**results);
int main(int argc,char*argv[]){
结构书数据[5];
//初始化书池内部数据
结构书*书籍;
unsigned int books\u count=从(1973,5,数据和书籍)中获取书籍;
返回0;
}
unsigned int get_books_from(unsigned int year,int length,struct Book data[],struct Book**results){
*结果=(结构书*)malloc(结构书的大小);
无符号整数结果\u计数=0;
int i;
对于(i=0;i
除了其他答案外:

您可能需要这样的代码(未经测试、无错误检查的代码、声明和#包含ommited以简洁明了):

unsigned int get_books_from(unsigned int year,int length,struct Book data[],struct Book**results);
int main(int argc,char*argv[]){
结构书数据[5];
//初始化书池内部数据
结构书*书籍;
unsigned int books\u count=从(1973,5,数据和书籍)中获取书籍;
返回0;
}
unsigned int get_books_from(unsigned int year,int length,struct Book data[],struct Book**results){
*结果=(结构书*)malloc(结构书的大小);
无符号整数结果\u计数=0;
int i;
对于(i=0;i
哦,天哪。你说得对。我通过值将指针传递给函数,它不会随realloc()而改变……而且,您没有动态分配它,因此无法动态重新分配它。我没有?它是
malloc
ed,位于
get\u books\u from
的第一行。哦,所以您完全忽略传入的值!就个人而言,我会执行
structbook*data=NULL
并将
&data
传递给函数。在函数中,去掉
malloc
,将
realloc
放在赋值之前。第一个
relloc
,当传递
NULL
时,将分配。噢,天哪。你说得对。我通过值将指针传递给函数,它不会随realloc()而改变……而且,您没有动态分配它,因此无法动态重新分配它。我没有?它是
malloc
ed,位于
get\u books\u from
的第一行。哦,所以您完全忽略传入的值!就个人而言,我会执行
structbook*data=NULL
并将
&data
传递给函数。在函数中,去掉
malloc
,只需放入
realloc