c - Malloc 基于现有文件的文件缓冲区大小

标签 c malloc stdio fseek

在我的项目中,我需要将共享文件复制到一个名为 share 的目录中。我的想法是使用 fgets 和 fputs 复制这个文件的内容:

FILE *fp;
int size;
char *fileBuff

fseek(fp,0,SEEK_END );
size=ftell(fp);
printf("Size of %s: %d bytes.\n",path,size); // print correct size 
fileBuff=malloc(size); // mallocate the file buffer
printf("\nsize of file buffer is %d",sizeof(fileBuff)); //always print 4!!
while(!feof(fp)){
    fgets(fileBuff,size,fp); // put into file buffer

}
printf("\nsize of file buffer is %d",sizeof(fileBuff)); // also print 4!!

但是,文件缓冲区不能分配,这个文件缓冲区的大小总是 4。发生了什么事?

更新: 好像有些误会。 sizeof() 只是为了让我检查文件缓冲区中是否存储了任何东西。我确实尝试了 strlen(fileBuff),它总是给我 1。

最佳答案

这是错误的:sizeof(fileBuff) .这将是指针的大小,在您的系统上为 4。

您不能使用 sizeof “提取”由 malloc() 返回的内存块的大小.您不能使用 anything 来提取该大小,这在(标准)C 中根本不可能。您需要使用 size值,即 malloc() 的参数.

此外,<a href="http://linux.die.net/man/3/ftell" rel="noreferrer noopener nofollow">ftell()</a>返回 long , 不是 int和两个malloc()并且各种 I/O 调用可能会失败,您需要考虑到这一点。

在我看来,使用文件大小的缓冲区来进行简单复制并不是一个好主意;最好使用“合理的”缓冲区(其确切的最佳大小取决于很多因素),然后在循环中重复读写对,直到流过整个文件。

更新关于您的代码的更多要点:

  1. 你谈论使用strlen()但代码显示 sizeoffread()之后,也是。
  2. 你谈论使用sizeof “检查”缓冲区中是否有任何东西,这是不可能的;任何带有 sizeof 的表达式总是在编译时评估1,它不能用于检查这样的动态事物。同样,您不能使用它来计算 malloc() 返回的内存块的大小。 .
  3. 使用 strlen()在保存文件数据的缓冲区上,只有当文件是二进制文件并且在其最后位置包含“\0”时才能可靠地工作,否则你将有一个未终止的字符串和 strlen()可能会调用未定义的行为。
  4. 如我所说,您需要检查 malloc()返回 NULL ,如果未能分配请求的内存块,它将执行此操作。

1 除了flexible arrays在 C99 中,但让我们忽略它。

关于c - Malloc 基于现有文件的文件缓冲区大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10138192/

相关文章:

c - 有没有办法在 C 文件中找到特殊字符 '\n' 的位置?

c - 为什么是 "strcat already defined in ***.obj"?

C读取重命名的文件

c - 检查相邻数组的简单方法

c++ - 释放分配给空指针数组的内存

c - 编译后出错

c - 释放 malloc 不会删除 char 数据

c - Linux 上使用的 malloc 版本

C 代码 - 没有足够的可用内存将数据从 txt 文件读取到用于 Debug模式的一维动态数组

c++ - 如何将 WriteConsoleInput 写入等待 ReadConsoleInput 的子应用程序?