

はじめに要素の数を指定して、数値を一つずつ入力していくとその最大値,最小値,平均値,最頻値,合計値を出力するプログラムをc言語で組んでいるのですが、その最頻値を出すために数値の出てきた回数を比較する配列の変数comを要素の数を聞いたあとに宣言したところ、まだ代入をしていないのに一番目の要素が"399423024"と異常に大きい数が代入された状態になっています。特にコードエラーは出てません。

実行環境はこちらです。  
<https://play.google.com/store/apps/details?id=app.compiler>

以下コード

[code]

    #include<stdio.h>
    int maxmin(void);
    
    int main(void)
    {
        maxmin();
        return 0;
    }
    int maxmin(void)
    {
        int a,i,l;
        double he,max=0,momax=0,min,mo;
        
        scanf("%d",&a);
         int com[a];
        double suu[a],mode[a],modee[a];
    
        for(i=0;i<a;i++){
            scanf("%lf",&suu[i]);
              
              for(l=0;l<=i+1;l++){
                if(suu[i]==mode[l]){
                    com[l]+=1;
                    break;
                }else{
                    if(mode[l]==0){
                        mode[l]=suu[i];
                        com[l]+=1;
                        break;
                    }
                }
              }
              
             if(i==0){
                min=suu[i];
             }
            printf("%d番目の数:%7.3f\n",i+1,suu[i]);
            if(suu[i]>max){
                max=suu[i];
            }else{
                if(suu[i]<min){
                    min=suu[i];
                }
            }
             he+=suu[i];
        }
         
         for(i=0;i<a;i++){
            if(com[i]>momax){
                for(l=0;l<a;l++){
                    modee[l]=0;
                    if(modee[l]==0){
                        break;
                    }
                }
                momax=com[i];
                modee[0]=mode[i];
            }else{
                if(com[i]==momax){
                    for(l=0;l<a;l++){
                        if(modee[l]==0){
                            modee[l]=mode[i];
                            break;
                        }
                    }
                }
            }
         }
         printf("%7.3f",modee[2]);
         printf("最頻値");
         for(i=0;i<a;i++){
            printf("%7.3f",modee[i]);
            if(modee[i+1]!=0){
                printf(",");
            }else{
                printf("\n");
                break;
            }
         }
    
        printf("最大値%7.3f\n最小値%7.3f\n平均値%7.3f\n合計値%7.3f\n",max,min,he/a,he);
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2023-02-15T01:21:58.383
93840
2023-02-15T13:52:44.753
2023-02-15T02:12:16.320
3060
52948
question
c
変数宣言をしたときにはじめから数値が代入されている


> まだ代入をしていないのに一番目の要素が"399423024"と異常に大きい数が代入された状態

宣言だけだと値は不定なので  
for文(など)で初期値をいれましょう。


CC BY-SA 4.0
2023-02-15T01:57:44.963
93841
2023-02-15T01:57:44.963
13127
93840
answer


専門用語で「自動変数」と呼ばれる種類の変数、この例では `int com[a];` などは、初期化を行わないと値が不定です。すなわち `0`
が入っているとは限りません。 `399423024` が入っていても全く正常です。

値 `0` が入っていてほしいのであれば `0` の代入が必要です。


CC BY-SA 4.0
2023-02-15T01:59:02.980
93842
2023-02-15T01:59:02.980
8589
93840
answer


> まだ代入をしていないのに一番目の要素が"399423024"と異常に大きい数が代入された状態になっています。

C言語では変数宣言時にスタック領域内の空いているメモリを確保して使用します。  
この時、 **直前にそのメモリを何が使用したか、どんな値が入っていたかは全く分かりません**
。つまり399423024とは「確保する前に他のシステム等が使用した残骸」であって意味のある数字ではありません。

C言語では宣言時に自動で初期化を行ってくれないのでそのままにしておくとバグの原因になります。これを回避するために初期化式を入れるのです


CC BY-SA 4.0
2023-02-15T02:10:09.390
93843
2023-02-15T02:10:09.390
56458
93840
answer


未初期化の自動変数の参照は、不定値の参照または **未定義動作** を引き起こします。  
従って、必ず初期化してから参照しましょう。

C言語で未初期化のローカル変数にはゴミ値が入ってるとは限らない  
<https://qiita.com/fujitanozomu/items/cc0d578114ee5b825b43>

EXP33-C. 初期化されていないメモリからの読み込みを行わない  
<https://www.jpcert.or.jp/sc-rules/c-exp33-c.html>


CC BY-SA 4.0
2023-02-15T13:52:44.753
93860
2023-02-15T13:52:44.753
7291
93840
answer