C言語関係掲示板

過去ログ

No.1102 n個の配列を用意したいのですが…

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

n個の配列を用意したいのですが…
投稿者---ねこのすけ(2004/03/21 16:54:43)


C言語の勉強を始めて1週間程度の者です。
単純なことかも知れませんが、お教えいだだきたいです。

ユーザが要素の数(n)を入力して、
n個の配列(hoge[n])を使いたいのですが、どうすればいいでしょうか。
一応下記ソースのように考えてみたのですが、うまくいきません。
(hogeが配列として宣言されていないので当然なのでしょうが…)


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

int main(void)
{
    int i, n;
    int *hoge;
    
    scanf("%d", &n);
    *hoge = (int)malloc( sizeof(int)*n );

    for ( i=0; i<n; i++ )   scanf( "%d", &hoge[i] );
    for ( i=0; i<n; i++ )   printf( "%d\n", hoge[i] );

    free(hoge);

    return 0;
}


配列を宣言しておいて、malloc()で必要な大きさを割り当てられれば…
と考えているのですが、そういう方向ではないのでしょうか。
それとも配列全体の大きさがあらかじめわかっていなければ使えないのでしょうか。

よろしくお願いします。


No.1495

Re:n個の配列を用意したいのですが…
投稿者---iijima(2004/03/21 17:15:34)


> *hoge = (int)malloc( sizeof(int)*n );

mallocの戻り値はポインタですから,
     hoge = (int*)malloc( sizeof(int) * n );

がよろしいのでは?


No.1496

Re:n個の配列を用意したいのですが…
投稿者---ねこのすけ(2004/03/21 17:51:51)


ご回答ありがとうございます。おかげさまでうまくいきました。
もうひとつご質問させていただきたいのですが、
同じことを文字列でやる場合はどうなるのでしょうか。

ご回答いただいたのと同じことをchar*型でやってみましたがうまくいかず、
下記ソースのようにするとできました。


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

int main(void)
{
    int  i, n;
    char    *hoge[32];
    char    *piyo;

    scanf("%d", &n);    
    piyo = (char*)malloc(sizeof(hoge)*n);

    for ( i=0; i<n; piyo += sizeof(hoge), i++ ) scanf("%s", piyo);

    piyo -= sizeof(hoge)*n;
    for ( i=0; i<n; piyo += sizeof(hoge), i++ ) printf("%s\n", piyo);

    return 0;
}


ただ、これだと配列の利便性がほとんどなくなってしまいますし、
いかにも無駄な手順を踏んでいるようにも感じます。

何度も申し訳ありませんが、よろしくお願いします。


No.1497

Re:n個の配列を用意したいのですが…
投稿者---たか(2004/03/21 20:10:44)


題意から察するに、次のような事をされたいのかと思います。
配列へのポインタを使用すればうまくいきます。

それから、malloc()で確保した領域はなるべくfree()しましょう。
小さいプログラムだといいかもしれませんが、大規模なプログラムで
しかも継続的に動かす場合はいつの間にかメモリリークが忍び込んで
デバッグがほとんど不可能になります。

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

int main(void)
{
  int i, n;
  char (*hoge)[32];

  scanf("%d", &n);    
  hoge = (char (*)[32])malloc(sizeof(char [32]) * n);

  for (i = 0; i < n; i++)
    scanf("%s", hoge[i]);

  for (i = 0; i < n; i++)
    printf("%s\n", hoge[i]);

  free(hoge);

  return 0;
}



No.1498

Re:n個の配列を用意したいのですが…
投稿者---ねこのすけ(2004/03/21 21:15:52)


ありがとうございます。解決しました。
「配列の先頭要素へのポインタ」ということしか頭になく、
「配列(そのもの)へのポインタ」ということがわかっていませんでした。

配列へのポインタを使うことで、hogeに1プラスすると
sizeof(char[32])*nの分だけポインタが進むことになるんですね。

理解はなんとなく怪しい部分もありますが、そこは教科書を見て勉強します。
またわからないことがあったらよろしくお願いします。


# 領域の開放についてもご指摘ありがとうございます。
# 気をつけてはいるんですが、ついつい忘れがちです(^^;;
# コンパイラも警告してくれないので、いつか痛い目見そうですよね。


No.1499

Re:n個の配列を用意したいのですが…
投稿者---たか(2004/03/21 22:07:36)


>配列へのポインタを使うことで、hogeに1プラスすると
>sizeof(char[32])*nの分だけポインタが進むことになるんですね。

これはhogeに1プラスすると、ではなくて、hogeにnプラスすると、
の間違いですよね。


No.1500

Re:n個の配列を用意したいのですが…
投稿者---ねこのすけ(2004/03/21 22:40:21)


>これはhogeに1プラスすると、ではなくて、hogeにnプラスすると、
>の間違いですよね。

失礼しました。
hogeに1プラスするとsizeof(char[32])進んで、
hogeにnプラスするとsizeof(char[32])*n進むということです。