2012-10-27 52 views
0

字符缓冲区是否有最大大小?我有一个程序正在为char缓冲区收集字符串并将其写入proc文件。在某一点后,它似乎停止写东西 - 那里有太多东西吗?什么是最大尺寸,我可以解决这个问题?C中字符缓冲区的最大大小?

这是代码。这是一个LKM - 是内核空间提供的limits.h文件吗?

为本:

const char* input = "hooloo\n"; 

下一页:

int read_info(char *page, char **start, off_t off, int count, int *eof, void *data) 
{ 

    unsigned int mem; 
    char answer_buf[strlen(input) + 1 + 14]; 
    name_added = vmalloc(strlen(input) + 1 + 14); 
    strcpy(name_added, input); 
    strcat(name_added, extension); 
    mem = sprintf(answer_buf, "%s\n", name_added); 
    memcpy(page, answer_buf, mem); 
    return strlen(answer_buf) + 1; 
} 

所有在我的代码是这样的事情是事情remalloc缓冲区,并添加到它。此外,该read_info是为procfile。这个问题是我一直向上面的代码中添加上面的代码 - 最终我加入了我的proc文件和文本中断 - 它不会像我想要的那样永远持续下去) - =。

+3

显示代码。 'buffer'是一个静态数组还是'malloc'ed? –

+0

字符串大小总是令人头痛......它通常由您的使用和运行平台来近似。我经常使用的两种尺寸是255和10000 – texasbruce

+0

'begin_input'变成了多长时间? 'char answer_buf [strlen(begin_input)+ 1 + 14];如果堆栈变大,可能会溢出。 –

回答

2

“C”中没有具体的最大尺寸。 C平台上任何对象的理论(或“潜在”)最大大小由实现决定,通常从底层机器平台和操作系统的属性派生。

在具有平坦内存模型的平台上,它通常受理论上地址空间的大小以及实际上可用空闲内存(或特定种类)的大小的限制。

在具有分段内存模型的平台上,它可能受限于段大小,该大小小于地址空间大小。尽管通过在代码中“模拟”平面内存模型,实现可以自由违反该限制。出于这个原因,在这样的平台上,最大对象大小也可以取决于编译设置。

2

动态分配的字符缓冲区的唯一最大大小将是可用的系统内存。

堆栈上的缓冲区的大小受最大堆栈大小的限制。这将根据主机操作系统的不同而有很大差异

将数据写入文件时,是否检查由fwrite返回的大小,并在需要时重复调用以写入剩余的缓冲区?

+2

如果'buffer'是一个静态大小的数组,那么通常在达到系统内存限制之前,通常会碰到堆栈大小限制。答案对于动态分配的缓冲区是正确的。 – Praetorian

+0

好点,谢谢。我相应地更新了我的答案。 – simonc

-3

我会说这是至少能够处理1000点独特的字符

-1

你在你的代码中的内存泄漏!

以下内存永远不会被释放:

name_added = vmalloc(strlen(input) + 1 + 14); 

我不明白为什么你的输出分配内存的。 而且你在堆栈和堆上都做了两次。

调用者为输出提供了一个缓冲区。 使用它! 不要创建副本!