C数组在被函数修改后损坏
我试图编写一个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
#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