gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:11 24 4
gpt4 key购买 nike

在我的项目中,我需要将共享文件复制到一个名为 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com