当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C数组在被函数修改后被破坏》经验,为你挑选了1个好方法。

我正在尝试编写一个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并且看起来这些变量在函数完成后没有指向内存中的相同位置.可能是什么问题呢?



1> David Schwar..:

get_books_from改变了它的价值results此处:

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

但它没有为调用者提供获取新值的方法results.

更糟的是,你叫get_books_fromdata,这是在栈上分配main.你不能realloc.至于文件realloc说,指针您正试图重新分配必须被前一个调用返回malloc,callocrealloc.幸运的是,你忽略了那个价值.但呈现struct Book data[5];main不知所云.为什么要在堆栈上分配空间?


就个人而言,我会做`struct Book*data = NULL`并将`&data`传递给函数.在函数中,去除`malloc`并在赋值之前放置`realloc`.第一个`relloc`,当传递`NULL`时将分配.
推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有