为何超大数组sizeof输出异常?何时触发运行时错误?
栈上超大数组的异常输出与内存问题
先看你给出的代码:
#include <stdio.h> int main(void) { char big_array[10000000000]; printf("%d", sizeof(big_array)); return 0; }
为什么输出1410065408而非10000000000?
这是整数溢出导致的问题。10000000000远大于32位有符号整数的最大值(231-1=2147483647),多数编译器处理数组大小时,若用32位整数类型解析这个数值,会发生截断:将10000000000对232取模,结果就是1410065408。编译器实际按这个溢出后的数值创建数组,所以sizeof(big_array)返回的是这个错误的大小。
何时会触发栈内存不足的运行时错误?
栈的大小是有限制的(比如Linux系统默认栈大小通常为8MB左右),只有当溢出后的数组大小仍然超过栈的可用空间时,才会触发栈溢出的运行时错误(比如段错误)。如果溢出后的数值刚好小于等于栈的可用空间,程序会成功分配数组,不会报错,只会输出截断后的错误数值。
举个例子:若把数组大小改成更大的数,溢出后的值超过8MB,运行程序就会直接崩溃;但如果溢出后的值在栈的范围内,就会像你现在的情况一样,输出错误数值但程序能正常运行。
内容的提问来源于stack exchange,提问作者chiru player
相关产品推荐
相关产品推荐

