use*_*010 20 c memory arrays buffer char
#define HUGE_NUMBER ???
char string[HUGE_NUMBER];
do_something_with_the_string(string);
Run Code Online (Sandbox Code Playgroud)
我想知道什么是我可以添加到char数组的最大数量,而不会冒任何潜在的内存问题,缓冲区溢出等风险.我想让用户输入,也许最大可能.
Gre*_*reg 14
请看Jack Klein的回复(参见原帖):
原始C标准(ANSI 1989/ISO 1990)要求编译器成功转换至少一个包含一组环境限制的示例的程序.其中一个限制是能够创建至少32,767字节的对象.
在1999年对C标准的更新中,该最小限制被提高到至少65,535字节.
不需要C实现来提供大于该大小的对象,这意味着它们不需要允许大于(int)(65535/sizeof(int))的int数组.
实际上,在现代计算机上,不可能事先说出可以创建多大的数组.它可能取决于计算机中安装的物理内存量,操作系统提供的虚拟内存量,已运行的其他任务,驱动程序和程序的数量以及使用的内存量.因此,您的程序今天可能会使用比昨天使用的更多或更少的内存,或者它将能够在明天使用.
许多平台对自动对象施加了最严格的限制,即在不使用'static'关键字的情况下在函数内定义的对象.在某些平台上,如果它们是静态的或动态分配,则可以创建更大的数组.
现在,为了提供更加量身定制的答案,请不要声明巨大的阵列以避免缓冲溢出.这与C中可以想到的最差实践接近.相反,花一些时间编写好的代码,并仔细确保不会发生缓冲区溢出.另外,如果您事先不知道阵列的大小malloc,那么它可能会派上用场:P
这取决于char string[HUGE_NUMBER];放置的位置.
它在功能内吗?然后阵列将在堆栈上,并且操作系统的增长速度是否以及速度取决于操作系统.所以这是一般规则:不要在堆栈上放置大型数组.
它是一个函数然后它是全局的(进程内存),如果操作系统在尝试加载你的程序时不能分配那么多的内存,你的程序将崩溃,你的程序将没有机会注意到(所以以下是更好:)
应该是大型阵列malloc.对于malloc,操作系统将返回一个空指针,如果malloc失败,取决于操作系统及其分页方案和内存映射方案,这将失败1)没有连续的空闲内存区域足够大的数组或者2)操作系统无法将足够的空闲物理内存区域映射到作为连续内存对您的进程显示的内存.
因此,使用大型数组执行此操作:
char* largeArray = malloc(HUGE_NUMBER);
if(!largeArray) { do error recovery and display msg to user }
Run Code Online (Sandbox Code Playgroud)