如何增加数组的限制?

时间:2013-10-09 10:51:03

标签: c arrays

// C Program to find average of numbers given by user
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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的系统。请帮助:)

5 个答案:

答案 0 :(得分:4)

char buf[11111111];

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

你可以:

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

    ulimit -s 12000

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

  • 动态分配内存:

    char *buf = malloc(11111111);

  • 在堆栈旁边的其他位置分配空间:

    static char buf[11111111];

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

答案 1 :(得分:2)

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

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

或者您可以尝试使用malloc:

动态分配内存而不是堆栈
char *buf = malloc(A_BIG_NUM);

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
void main() {
  struct rlimit rl;
  int ss = getrlimit(RLIMIT_STACK, &rl);
  printf("soft = %lu, hard = %lu\n", rl.rlim_cur, rl.rlim_max);
}