// 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的系统。请帮助:)
答案 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);
}