配列の値が正しくない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
seira
記事: 2
登録日時: 2年前

配列の値が正しくない

#1

投稿記事 by seira » 2年前

質問です。
下記に書いてあるソースコードを実行すると、a[0][0]に格納したはずの値が出力されるときにはb[0][1]に格納された値が出力されてしまいます。何がいけないのか教えてただけますでしょうか?
本当に初心者も初心者なので、お手柔らかにお願いいたします。
[環境]
windows 10
visual studio code

コード:

#include <stdio.h>
#include <math.h>

int main(){
    float a[2][2],b[1][2],det;
    int i,j;

    for ( i = 0; i < 2; i++)
    {
      scanf("%f",&a[0][i]);
    }
      scanf("%f",&b[0][0]);
    
    for ( j = 0; j < 2; j++)
    {
      scanf("%f",&a[1][j]);
    }
     scanf("%f",&b[1][0]);
    
    for ( i = 0; i < 2; i++)
    {
        for ( j = 0; j <2; j++)
        {
            printf("a[%d][%d]=%f,",i,j,a[i][j]);
        }
        
    }
}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 配列の値が正しくない

#2

投稿記事 by みけCAT » 2年前

C言語では、配列の添字は0から始まり、宣言時には最大の添字ではなく要素数を指定します。
今回の場合、配列 b は float[2] 型の要素を1個しか持たない配列として宣言されているので、
b[1] は確保されておらず、範囲外となります。
したがって、

コード:

     scanf("%f",&b[1][0]);
は、値の読み込みに成功した場合、範囲外への書き込みが発生し、周りのデータが破壊される原因となります。

質問文で言及されている b[0][1] へのアクセスがコード内に見当たらないので、この行を

コード:

     scanf("%f",&b[0][1]);
とするべきであると予測できます。
他の修正方法としては、
・範囲外へのアクセスにならないよう、配列 b に十分な要素数を確保する
 すなわち、変数宣言で b[1][2] のかわりに b[2][2] などとする。
・配列 b に保存した値は使われていないようなので、読み込んだ値を書き込むのをやめる
 すなわち、 scanf("%f",&b[1][0]); のかわりに scanf("%*f"); とする。
などが考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

seira
記事: 2
登録日時: 2年前

Re: 配列の値が正しくない

#3

投稿記事 by seira » 2年前

天才ですね
ありがとうございます

返信

“C言語何でも質問掲示板” へ戻る