-1
// 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;

配列の制限を 11111111、68297907 (など) のような 8 桁以上の数字に変更すると、プログラムはコンパイルされますが、出力ではSegmention Error.

配列の制限を増やすにはどうすればよいですか? UNIX ベースのシステムを使用しています。

4

5 に答える 5

4
char buf[11111111];

これは 11 メガバイトを超えています。スタックに割り当てられます。スタックのサイズは有限で、多くの場合 8 または 10 メガバイトです。スタック オーバーフローが発生しています。通常、その制限を超えると、セグメンテーション違反が発生します。

あなたはできる:

  • システムがサポートしている場合は、スタック制限を増やします。あなたが使用しているシステムの種類を教えてくれません。これは通常、シェルを介して行われます。bash の場合は、eg を実行します

    ulimit -s 12000
    

    最大スタック サイズを 12000 キロバイト (120 メガバイト) に設定します。管理者によって設定された制限により、これほど多くのスタック領域を使用できない場合があります。ulimit上記のコマンドを実行したのと同じシェルでプログラムを実行する必要があります。

  • メモリを動的に割り当てます。

    char *buf = malloc(11111111);
    
  • スタック以外の場所にスペースを割り当てます。

    static char buf[11111111];
    

ただし、誰かが 1 行に 11 メガバイトのデータを入力できるようにする必要があるかどうかは疑問です。

于 2013-10-09T11:24:34.630 に答える
2

おそらく、許可されるスタック サイズを増やす必要があります。

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

または、malloc を使用してスタックではなく動的にメモリを割り当ててみることもできます。

char *buf = malloc(A_BIG_NUM);
于 2013-10-09T11:12:01.233 に答える