【问题标题】:Buffer size and reading from a file缓冲区大小和从文件中读取
【发布时间】:2013-03-25 15:31:39
【问题描述】:

我已经问过一个类似的问题,但我认为现在问题不同了.. 我在eclipse,linux机器上用C写。

我需要读取测试文件,并且每次都尝试使用不同的缓冲区大小... 我知道如果缓冲区的大小太小,我需要在缓冲区上运行几次,但我不知道该怎么做......

这是我的代码(当我在大小为 67108864 的缓冲区上运行时,我遇到了分段错误。 * 我编辑了我的代码

int main(void)
{   int fd;
    char* buff = malloc (67108864);
    if (buff){
    fd = open("testfile.txt", O_RDONLY);
    if (fd >= 0) {
        while (read(fd,buff,67108864)!=0){}
        close(fd);
    }
    }
free(buff);
return 0;
}

【问题讨论】:

  • 它在我的机器上工作正常,67108864 是 2**26,由于你的数据类型是 char(1 字节),它只有 64MB,应该可以正常工作。您可能需要检查“读取”函数的返回值,错误时为 -1。

标签: c linux


【解决方案1】:

这不是char[]

char* buff[67108864];

但是是char* 的数组。改为:

char buff[67108864];

另外,buff 的大小对于堆栈来说可能太大了。堆栈的典型大小为 1MB(1048576 字节),但 buff 的大小远远超过(64MB!),这将导致堆栈溢出错误。如果你想使用这个缓冲区动态分配它,使用malloc(),稍后释放它,使用free()

char* buff = malloc(67108864);
if (buff)
{
    /* Use 'buff' and then release it. */

    free(buff);
}

【讨论】:

  • @Bobbbaa,我怀疑你被建议将 buff 设置为 char*,而不是 char*[],并使用动态分配的内存。
  • 在您的earlier question 中,您使用了malloc - 顺便说一句,您应该考虑撤消对先前问题应用的编辑,因为它会使答案变得混乱
  • 谢谢,反正我在这里编辑了我的代码...你们能告诉我现在看起来还可以吗??
【解决方案2】:

去掉*,你声明的是一个指针数组,但是你需要一个字符数组。

   char buff[67108864];

我不确定67108864 对于堆栈来说太大了。尝试在堆上进行。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2014-06-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    相关资源
    最近更新 更多