如何在C语言中声明足够大的缓冲区?

如何在C语言中声明足够大的缓冲区?,c,arrays,malloc,C,Arrays,Malloc,我想知道如何在C中声明存储的确切大小,如果我使用数组或进行内存分配(如malloc),它们都需要事先确定大小。在这种情况下,我将声明一个非常大的大小以防止溢出,但它仍然有发生的可能性 比如说 如果我想将文本文件拆分为单词,我需要声明一个字符**来存储单词字符串,但我不知道要拆分多少单词 如果要将文件内容读入数组 我需要声明一个要存储的大缓冲区 缓冲区=mallocsizeofchar*1000 有更好或正确的解决方案吗?谢谢 #include <stdio.h> #include &

我想知道如何在C中声明存储的确切大小,如果我使用数组或进行内存分配(如malloc),它们都需要事先确定大小。在这种情况下,我将声明一个非常大的大小以防止溢出,但它仍然有发生的可能性

比如说

如果我想将文本文件拆分为单词,我需要声明一个字符**来存储单词字符串,但我不知道要拆分多少单词

如果要将文件内容读入数组

我需要声明一个要存储的大缓冲区

缓冲区=mallocsizeofchar*1000

有更好或正确的解决方案吗?谢谢

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

void read_chars(char * file_name ,char * buffer);

int main(int argc ,char * argv[])
{
    char * buffer ;
    buffer = malloc(sizeof(char)*1000);
    read_chars(argv[1],buffer);
    printf("%s",buffer);
}

void read_chars(char * file_name ,char * buffer)
{
    FILE * input_file ;
    input_file = fopen(file_name,"r");
    int i = 0;
    char ch;
    while((ch = fgetc(input_file)) != EOF)
    {
        *(buffer+i) = ch;
        i++;
    }
    *(buffer+i) = '\0';
    fclose(input_file);
}

缓冲区的要点通常是固定大小,允许您以块的形式读取数据。如果您正在读取一个文件,那么您不应该将其全部保存在内存中,除非您知道该文件的大小并且该文件不太大

声明一个缓冲区大小,传统上是2的幂,比如2048,并将文件分块读入其中,然后在每次读取块时在块上运行逻辑。然后使用恒定内存,可以读取任何大小的文件,并且不必猜测

缺点是,您可能在处理与缓冲区边界重叠的项时遇到问题。在这些情况下,你可能需要更加努力才能让你的逻辑发挥作用


或者,看看mmap,将整个文件虚拟地映射到内存中,您仍然需要知道它有多大!但是你可以在一个被接受的答案之后再回答:

1目前对系统的典型攻击是缓冲区溢出。如果您的系统可以处理1000字节,则会有人尝试1001。因此,与其说解决方案可以处理任意大的缓冲区,不如为任务定义一个上限。如果要查找名称,1024字节应该可以。如果代码需要重新工作,此大小应该易于调整。较长的值可能是攻击,不需要正常处理。应该检测它们,并将其声明为无效输入

不要从树上错过森林。我发现OP代码有一个经典错误很有趣。如果getc返回255的法定值,然后将其分配给ch,ch可以与EOF进行比较并停止。在所有关于缓冲区大小的讨论中,ch的大小太小

// char ch;
int ch;
while((ch = fgetc(input_file)) != EOF)

3个read_char应该将缓冲区大小传递给它,以便函数可以使用该信息:read_charsargv[1],buffer,1000。

使用realloc?查看realloc。检查文件大小。请始终检查调用fopen的结果;关于提前获取文件大小的想法,使用r打开文件是否会阻止其他程序附加数据?以某种方式更改文件的长度。@chux:取决于操作系统和/或文件系统。IIRC Windows不允许您写入另一个进程正在使用的文件,除非您都使用指定的共享权限专门打开该文件。Linux在这方面通常没有那么严格。由于大多数*nix文件系统的工作方式,在某些情况下,您甚至可以写入已删除的文件!或者,删除另一个进程正在写入的文件。