2013-10-09 78 views
0
// 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的系统。请帮助:)如何增加数组的限制?

+2

你可以尝试的malloc,但我不明白为什么1111是行不通的。 –

+3

char buf [4000];在Linux上适用于我。 – BjoernD

+1

您必须增加可用于应用程序的堆栈大小。但是1111和6829以及5736应该都可以工作。 – RedX

回答

2

堆栈默认大小通常设置为8MB。一些平台具有默认的10MB堆栈大小。一个11111111元素的字符数组是〜11MB,比堆栈大得多。因此您不能申报

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

1

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

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

3
char buf[11111111]; 

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

您可以:

  • 增加堆栈的限制,如果你的系统支持它。你不会告诉我们你在使用什么样的系统。这通常通过shell完成。 对于bash,运行例如

    ulimit -s 12000

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

  • 动态分配内存:

  • 分配的空间别的地方,除了在堆栈:

    static char buf[11111111];

我会质疑需要允许某人尽管在一行上输入11兆字节的数据。

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); 
}