gpt4 book ai didi

c - 释放函数内或 main 内的缓冲区

转载 作者:行者123 更新时间:2023-11-30 18:53:55 25 4
gpt4 key购买 nike

今天我正在尝试编写一个程序,我意识到我需要在程序中的更多位置读取一个文件,但在我到达那里之前我有以下内容:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *printFile(char *fileName){
long int length;
char *buffer;
size_t size;
FILE *file;

file = fopen (fileName , "r" );


fseek (file , 0 , SEEK_END);
length = ftell (file);
fseek (file , 0 , SEEK_SET);

buffer = (char *) malloc (sizeof(char)*(size_t)length);
if (buffer == NULL){
fputs ("Memory error",stderr);
exit (2);
}


size = fread (buffer,1,(size_t) length,file);
if (size != (size_t)length){
fputs ("Reading error",stderr);
exit(3);
}

fclose (file);
return buffer;
}

int main (void) {
char *fileName = "test.txt";
char *fileContent = printFile(fileName);

printf("%s", fileContent);

free(fileContent);

return 0;
}

正如你所看到的,我在主函数中使用了 free,在我意识到这对我的程序来说是不行的之后,我决定释放 printFile 函数中的缓冲区,现在我有了这个:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

char *printFile(char *fileName){
long int length;
char *buffer,*buffer2;
size_t size;
FILE *file;

file = fopen (fileName , "r" );
if (file == NULL){
fputs ("File error",stderr);
fclose (file);
exit (1);
}

fseek (file , 0 , SEEK_END);
length = ftell (file);
fseek (file , 0 , SEEK_SET);

buffer = (char *) malloc (sizeof(char)*(size_t)length);
if (buffer == NULL){
fputs ("Memory error",stderr);
exit (2);
}

buffer2 = (char *) malloc (sizeof(char)*(size_t)length);
if (buffer2 == NULL){
fputs ("Memory error",stderr);
exit (2);
}

size = fread (buffer,1,(size_t) length,file);
if (size != (size_t)length){
fputs ("Reading error",stderr);
exit(3);
}

strcpy (buffer2, buffer);
fclose (file);
free(buffer);

return buffer2;
}

int main (void) {
char *fileName = "test.txt";
char *fileContent = printFile(fileName);

printf("%s", fileContent);

return 0;
}

正如您可能注意到的那样,在释放第一个缓冲区之前,我使用了第二个指针(*buffer2)来复制第一个缓冲区的内容。

我的问题是:我的方法是对还是错?

最佳答案

欢迎来到内存管理!

您应该问的问题是:为什么您的第二种方法优于前一种方法?您释放了 buffer,但随后返回了 buffer2,并且有人必须释放 buffer2,因此您处于与之前完全相同的位置,除了您将文件内容复制了两次。

如果您不想在 printFile() 内分配内存,则强制调用者传入缓冲区。换句话说,将处理分配的责任转移到使用 printFile() 的任何代码上。当然,现在调用者必须担心分配足够大的缓冲区(尽管使用 stat(2) 或像您一样使用 stdio 包装器很容易获得文件大小)。

无论您最终使用什么方法,当您开始使用动态分配时,您都无法逃避内存管理:某人、某个地方必须负责释放内存。

关于c - 释放函数内或 main 内的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31620578/

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