如何增加数组的限制?

// C Program to find average of numbers given by user #include  #include  #include  void main() { double sum = 0; int ii = 0,c; char buf[256], *token; printf("Enter the numbers to average on a single line, separated by space and press enter when done\n"); fgets(buf, 255, stdin); token = strtok(buf, " "); while (token != NULL) { sum += atof(token); ii++; token = strtok(NULL, " "); //Get next number } printf("Average is %lf", sum / (double)ii); } 

第8行:char buf [256],* token; 当我将数组限制更改为任何8位或更多位数字,如11111111,68297907(等等..)然后程序得到编译,但在输出它显示’Segmention Error’。 如何增加数组限制? 我使用的是基于UNIX的系统。 请帮忙 :)

 char buf[11111111]; 

这超过11兆字节。 它被分配在堆栈上。 堆栈的大小有限,通常为8或10兆字节。 您正在获得堆栈溢出,如果超出该限制,通常会导致段错误。

您可以:

  • 如果系统支持,请增加堆栈限制。 您没有告诉我们您使用的系统类型。 这通常通过shell完成。 对于bash,运行例如

    ulimit -s 12000

    将最大堆栈大小设置为12000千字节(120兆字节)。 管理员可能设置了一个限制,阻止您使用这么多的堆栈空间。 您必须在运行上述ulimit命令的同一shell中运行程序。

  • 动态分配内存:

    char *buf = malloc(11111111);

  • 在堆栈之外的其他位置分配空间:

    static char buf[11111111];

我会质疑是否需要允许某人在一条线路上输入11兆字节的数据。

您可能需要增加允许的堆栈大小:

http://www.ss64.com/bash/ulimit.html

或者您可以尝试使用malloc动态分配内存而不是堆栈:

 char *buf = malloc(A_BIG_NUM); 

默认情况下,堆栈大小通常设置为8MB。 某些平台的默认堆栈大小为10MB。 一个11111111元素的字符数组大约是11MB,比堆栈大得多。 因此,您无法声明它

您可以增加堆栈大小。 但增加太多也不好。 在这种情况下,您应该使用堆分配。

合理。 数组buf用于以文本forms读取数字。 没有人需要输入10亿个数字(除了那些尝试缓冲区溢出攻击的数字),没有已知的C实现支持10亿个数字浮点数或双数字的指数或尾数。

过多和不必要的数组大小超出了堆栈大小的实现限制,并导致在您的情况下违反分段。

一切都写在上面。 由于克服了允许的堆栈大小,程序在启动时获得信号SIGSEGV。
下面是确定实际堆栈大小(软限制和硬限制)的另一种方法:

 #include  #include  #include  void main() { struct rlimit rl; int ss = getrlimit(RLIMIT_STACK, &rl); printf("soft = %lu, hard = %lu\n", rl.rlim_cur, rl.rlim_max); }