2013-10-09 48 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); 
}