C言語 配列とメモリ確保

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
MFJ-228

C言語 配列とメモリ確保

#1

投稿記事 by MFJ-228 » 6年前

C言語のメモリ確保についての質問です.
nを指定してメモリを確保,その分だけcsvファイルから配列に読み込んで出力するプログラムなのですが,
出力結果を見るとp[0]とp[1]に0、p[2]からcsvファイルの1行目が順番に格納されている状態になってしまいました.
csvファイルの中身は1から100まで順番に並んでいるものです.
(今回の出力は p[0]=0,p[1]=0,p[2]=1,p[3]=2,... といった感じになってしまっています)
p[0]=1,p[1]=2,....となるようにしたいのですが,このコードのどこがおかしいのでしょうか?

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int n; 
  int *a;

  printf("要素数:");
  scanf("%d", &n);

  a = (int *)calloc(n, sizeof(int));
  if (a == NULL)
    printf("メモリ確保に失敗\n");

  else{
      FILE *file;
      int i;

      //ファイルopen
      file = fopen("test.csv","r");
  
      if(file == NULL){
          printf("ファイルオープンに失敗\n");
        }
   else{
           for(i=0; i<n; i++)
               fscanf(file,"%d", &a[i]);
          fclose(file);
        }
    free(a); 
    }

      int i;
      for(i=0; i<n; i++)
         printf("a[%d]=%d\n", i, a[i]);

    return 0;
}


box
記事: 2002
登録日時: 13年前

Re: C言語 配列とメモリ確保

#2

投稿記事 by box » 6年前

MFJ-228 さんが書きました:

コード:

    free(a); 
    }

      int i;
      for(i=0; i<n; i++)
         printf("a[%d]=%d\n", i, a[i]);
何だかfreeで領域を解放した後にそこへアクセスしているように見えて仕方がありません。
freeを書くのであれば、もうちょい後ろに置くべきでは?
現状は、プログラムがたまたま落っこちないというだけで、実は非常にまずいように思えます。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

MFJ-228

Re: C言語 配列とメモリ確保

#3

投稿記事 by MFJ-228 » 6年前

すみません、p[]ではなくa[]でした

なるほどメモリ解放の位置ですか!
確かにそうでした
今出来ないので後程試してみます
回答ありがとうございます

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

Re: C言語 配列とメモリ確保

#4

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

MFJ-228 さんが書きました:このコードのどこがおかしいのでしょうか?
boxさんの言うとおり解放後の領域を使用していることに加え、
  • あってはいけない場所に全角スペースがある(26~28行目)
  • インデントが乱れている
という点もおかしいですね。
また、scanfやfscanfの戻り値(正しく読み込めているかどうか)をチェックしていないのもあまりよくないですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: C言語 配列とメモリ確保

#5

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

オフトピック
MFJ-228 さんが書きました:出力結果を見るとp[0]とp[1]に0、p[2]からcsvファイルの1行目が順番に格納されている状態になってしまいました.
csvファイルの中身は1から100まで順番に並んでいるものです.
(今回の出力は p[0]=0,p[1]=0,p[2]=1,p[3]=2,... といった感じになってしまっています)
未定義動作なので何がおこってもおかしくないとはいえ、不思議ですね。

全角スペースを半角スペース2個に置換してとりあえず要素数10で試してみたところ、最初の2個が(おそらく解放処理で?)0に破壊され、3個目以降は正しく出力されました。
https://wandbox.org/permlink/1satNJlXqgSH7yLA

さらに要素数100にして試してみたところ、最初の2個もなぜか正しく出力されました。
https://wandbox.org/permlink/HRlBB0lBTuFPQkNj
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

MFJ-228

Re: C言語 配列とメモリ確保

#6

投稿記事 by MFJ-228 » 6年前

freeの位置をreturn 0 の直前に変更したところ上手くいきました.
皆様回答ありがとうございました.

返信

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