【问题标题】:useing realloc() many times多次使用 realloc()
【发布时间】:2011-10-29 16:18:40
【问题描述】:

以下哪一项更可取

file=fopen(argv[1],"r");
arr=(unsigned int *)malloc(4);

while(!feof(file))
{
  ++arr_size;
  arr=(unsigned int *)realloc(arr,arr_size*sizeof(unsigned int)
  fscanf(file,"%u\n",&arr[arr_size-1]);
}
fclose(file);

或者这个

arr=(unsigned int *)malloc(some_size*sizeof(unsigned int));
file=fopen(argv[1],"r");
arr=(unsigned int *)malloc(4);

while(!feof(file))
{
  ++arr_size;
  fscanf(file,"%u\n",&arr[arr_size-1]);
}
fclose(file);

【问题讨论】:

  • 第二个有内存泄漏?您重新分配分配的空间而不释放它,甚至不使用第一行?
  • 对于realloc,您还必须小心,如果出现错误并返回 null,那么您会按照您编写的方式丢失原始指针。
  • 第二个也有大量缓冲区溢出,假设输入文件长度超过 4 个字节。
  • 应该删除第二个示例中的 arr=(unsigned int *)malloc(4);。
  • 在 C 中,最好不要从 malloc 或 realloc 转换返回值:c-faq.com/malloc/mallocnocast.html

标签: c memory dynamic allocation realloc


【解决方案1】:

为什么不是第三种方式——打开文件时算出你需要多少内存?

【讨论】:

  • 怎么做。文本文件不包含文件听众。因此我应该从上到下阅读文件。并再次阅读整数。所以我应该读两次文件?
  • @R Krishna Sagar:您可以在 Posix 上使用 fstat 获取文件大小,在 Windows 上使用 GetFileSizeEx 获取文件大小,或者更方便的是您可以将 fseek 放在文件末尾,然后使用 @987654324 @ 查找您当前的偏移量,即文件大小。请务必检查您使用的 API 中用于大小的整数类型,如果有可能遇到大文件 (>2GB),因为便携式 (ftell) 仅使用 long。
  • ftell 是首选方法; fstat 可能无法为某些特殊文件和设备提供答案。实际上ftello 在你有可用的 POSIX 函数时会更好,但如果文件比long 大,它几乎肯定不适合内存......
猜你喜欢
  • 1970-01-01
  • 2018-05-17
  • 2015-06-18
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多