2012-03-01 26 views
-1

構造体の2次元配列を作成したので、x、y、zに値を代入したいとします。セグメンテーション障害が発生しているアイデアはありますか?構造体の2次元配列を扱う際のセグメンテーションフォールト

struct xyz 
{ 
    int x; 
    int y; 
    int z; 
}; 

char buf[80]; 

struct xyz array[width][height]; 

for(row=1;row<=width;row++) 
{ 
    for(col=1;col<=height;col++) 
    { 
     fgets(buf,80,file); 
     array[row][col].x = strtol(buf, NULL, 10); 
     fgets(buf,80,file); 
     array[row][col].y = strtol(buf, NULL, 10); 
     fgets(buf,80,file); 
     array[row][col].z = strtol(buf, NULL, 10); 
    } 
} 
+1

配列インデックスは、私が馬鹿だオーケー –

答えて

1

SIそこから1からhight/colまで実行している理由はありますか? Cでは、すべての配列は0から始まり、長さ1で終わります。ループの他の言葉で

次のようになります。

for(row=0;row<width;row++) 
{ 
    for(col=0;col<height;col++) 
    { 
3

配列は、あなたがarray[width]にアクセスしているので、あなたが割り当てられたスペースの外にステッピングしているC.に0からスタート。おそらく、あなたは欲しい:

for(row = 0; row < width; row++) 
     ^ ^

は覚えておいてください、あなたはtype array[LENGTH]を宣言した場合、それは要素array[LENGTH]に触れることを決して有効です。 有効な最後の要素はLENGTH - 1です。

+0

を暗くしない1から、暗く-1を0から行きます。ありがとう!なぜ私は1が行と列の良いアイデアだと思ったのか分かりませんが、 – user1048723

3

あなたのループは、最後の反復で範囲外になります。

配列のサイズはwidthで、深さはheightなので、最初のインデックスは[0][0]で、最大有効インデックスは[width - 1][height - 1]です。ただし、状況に応じて<=を使用するので、実際には最後の反復で[width][height]をインデックスします。

はまた、配列はインデックス0、ない1から開始し、そう<=0代わりの1からあなたのループを開始し、<を使用し、ではありません。

+0

+1の前にそれを使ったことはありませんでした。 – ApprenticeHacker