C言語関係掲示板

過去ログ

No692 mallocを使った九九の表

[戻る] [ホームページ]
No.8117

mallocを使った九九の表のつくりかた
投稿者---初心者(2003/07/08 22:27:24)


学校の課題なのですがどうしてもわかりません(T_T)

キーボードから整数aを入力してa*aの二次元配列を動的メモリ確保し、九九の表を作るプログラムです

入力出力例が

input num:3
123
246
369

というふうになります。
誰か教えてください、お願いしますm(__)m

No.8120

Re:mallocを使った九九の表のつくりかた
投稿者---shelly(2003/07/08 23:55:04)


動的にメモリを確保するには、mallocなどを使います。

int *table;
table = (int *)malloc(a * a * sizeof(int));

mallocが成功すれば、後は静的に確保した配列と同様に
使えます。

使用後は
free(table);
で解放することをお忘れなく。




No.8121

Re:mallocを使った九九の表のつくりかた
投稿者---こん!(2003/07/09 00:32:35)


>int *table;
>table = (int *)malloc(a * a * sizeof(int));

二次元配列って言ってますけど・・・

No.8122

Re:mallocを使った九九の表のつくりかた
投稿者---初心者(2003/07/09 00:47:43)


返信ありがとうございますm(__)m
課題のプログラム無事に完成させることができました。

mallocの使い方がよくわからないのですが、

>table = (int *)malloc(a * a * sizeof(int));

のa*aとすると、2次元配列の動的メモリが確保されると考えればいいのでしょうか?

No.8124

Re:mallocを使った九九の表のつくりかた
投稿者---YuO(2003/07/09 01:34:03)


>mallocの使い方がよくわからないのですが、

mallocは,引数に渡したサイズだけの記憶域(ほとんどの場合,メモリのこと)を確保して,
その記憶域の先頭のアドレスを返します。


>>table = (int *)malloc(a * a * sizeof(int));
>のa*aとすると、2次元配列の動的メモリが確保されると考えればいいのでしょうか?

違います。擬似的には,
int table[a * a];
という感じになります。
#C99(=ISO/IEC 9899:1999←現行の標準C)なら擬似的でも何でもないですが……。


「コンパイル時に要素数の決まらない配列」の配列は,ポインタのポインタとして書くしかないです。
基本の書き方は,
int ** table;
int i;
table = malloc(a * sizeof(int *));
for (i = 0; i < a; ++i) {
    table[i] = malloc(a * sizeof(int));
}
となります。
ただし,これはあくまで「ポインタのポインタ」であって,いわゆる「二次元配列」(=配列の配列)ではないです。
本当に二次元配列を要求するところにこれを渡すと恐らくプログラムはクラッシュします。

C99であれば,VLAを使って配列のポインタにしたり,
int (*table)[a];
table = malloc(a * sizeof(int [a]));
配列の配列にしたり
int table[a][a];
できます。
#aが変数の時。
これらなら,本当に二次元配列を要求するところに渡すことが出来ます。


No.8132

Re:mallocを使った九九の表のつくりかた
投稿者---shelly(2003/07/09 08:18:43)


出来たんですね。

こんさんのレスにあったように、2次元というところを見てなかったもので
前述のように書きましたが、あれでは
table[0][0]のようには扱えなかったと思います。

よければ完成したソースを見せていただけませんか?



No.8137

Re:mallocを使った九九の表のつくりかた
投稿者---初心者(2003/07/09 08:45:28)


配列ではでは宣言できなかったので、for文だけで書いたんですが。

table=(int *)malloc(a*a*sizeof(int));
for(i=0; i<=a; i++){
  for(j=0; j<=a; j++){
  *table=i*j;
  printf("%3d",*table);
  }
printf("\n");
}
free(table) ;

としました。でも、掲示板のレスを見て
table=(int *)malloc(a*a*sizeof(int));
を、table=(int *)malloc(a*sizeof(int));
に変えて見たんですが、実行結果が同じになったので間違ってますよね…