我正在尝试编写一个C程序,它将所有通过特定条件的结构收集到一个数组中.
#include#include #include 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; }
逻辑似乎工作正常,但是当尝试访问函数books
外部的数组内容get_books_from
(它被调用results
)时,所有数据都会被破坏.一些原始数据仍在那里但不在正确的位置,看起来好像数据已经移位.我检查了指向两者的指针books
,results
并且看起来这些变量在函数完成后没有指向内存中的相同位置.可能是什么问题呢?
你get_books_from
改变了它的价值results
此处:
results = (struct Book*) realloc(results, (++results_count + 1) * sizeof(struct Book));
但它没有为调用者提供获取新值的方法results
.
更糟的是,你叫get_books_from
用data
,这是在栈上分配main
.你不能realloc
.至于文件realloc
说,指针您正试图重新分配必须被前一个调用返回malloc
,calloc
或realloc
.幸运的是,你忽略了那个价值.但呈现struct Book data[5];
在main
不知所云.为什么要在堆栈上分配空间?