2017-09-10 15 views
-2

enter image description here C言語の配列を動的に初期化するときはいつも、常にSIGSEGVエラーが発生します。私はいつも間違っていますか教えてください。CエラーのSIGSEGV

コードはTurboC上で正常に動作しますが、GCCを使用するオンラインジャッジでSIGSEGVを提供します。

Programming Problem

マイコード:スタートのために

#include<stdio.h> 
#include<stdlib.h> 
int main(void) 
{ 
    long n,h,i,crane=0,box=0,temp=0; 
    long *comm; 
    scanf("%ld %ld",&n,&h); 
    long *a = (long*)malloc(n*sizeof(long)); 
    for(i=0;i<n;i++) 
     scanf("%ld",&a[i]); 
    scanf("%ld",&comm[0]); 
    i=0; 
    while(comm[i]!=0) 
    { 
     i++; 
     scanf("%ld",&comm[i]); 
    } 
    for(i=0;comm[i]!=0;i++) 
    { 
     if(comm[i]==3) 
      box=1; 
     if(comm[i]==4 && box==1) 
     { 
      a[crane]=(a[crane]+1); 
      temp=0; 
     } 
     if(box==1 && (comm[i]==1 || comm[i]==2) && temp==0) 
     { 
      a[crane]=(a[crane]-1); 
      temp=1; 
     } 
     if(crane!=0 && comm[i]==1) 
      crane--; 
     if(comm[i]==2) 
      crane++; 
     if(comm[i]==0) 
      break; 
    } 
    for(i=0;i<n;i++) 
     printf("%ld ",a[i]); 
    free(a); 
    free(comm); 
    return 0; 

}

+1

プログラムの実行は上から下に行くことを覚えておいてください。変数を初期化する前に変数 'n'を使用することを考えてみましょう。 –

+0

@Someprogrammerdudeああ申し訳ありませんが、私はそれを持っています。それをもう一度コンパイルしてください。 –

+0

これは、 'n'の値が*不確定*(そして一見無作為)であるときに、' malloc 'の呼び出しで何が起こると思いますか? –

答えて

1

、そのコードでどこあなたが実際に指すようにcommためのメモリを割り当てています。 aについて同様のことを行い、最後にacommの両方を解放したので、これが必要であることは明らかです。

のメモリを使用する前に、mallocのメモリが必要です。そのI ドンに注意して、最初のscanf

comm = malloc(h*sizeof(long)); 

:たとえば、あなたが(それはどこにも使用されていないので、h、可能性の高い)ことが第2の値の入力に依存したい場合、あなたはで追加する必要があります「Tは、戻り値をキャスト - あなたはcommがそれを使用する前にする必要がありますどのように大きな分からないない場合C.

で、それを処理するための通常の方法は、特定の番号を割り当てることであることをやるべきではありません要素の数(容量)と、使用した数(サイズ)を記録します。あなたの容量があなたの容量を超えようとするたびに、より多くのスペースを得るためにreallocを使用してください。

下記(C状)の擬似コードは、空の配列で始まり、30個の要素より多くのスペースが必要になるたびことによってそれを拡大し、これを実行する方法を示しています。

comm = NULL 
capacity = 0 
size = 0 
for each value in input(): 
    if size == capacity: 
     capacity += 30 
     comm = realloc (comm, capacity), exit if error 
    comm[size++] = value 

。なお、ループ上のexit、sizeは、容量が増える可能性があるにもかかわらず、配列に含まれる要素数の指標です。


そして、余談として、あなたは常には、いくつかの点で失敗します(例えばscanfmallocなど)の障害の対象に呼び出すことを前提としなければなりません。つまり、の戻り値をチェックします。

+0

入力が0になるまでサイズを増やし続ける必要があります。何度も何度もreallocを呼び出すポインタを宣言することはできません。 –