C言語関係掲示板

過去ログ

No.614.mallocを使って、要求された分だけメモリ領域を確保

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

mallocを使って…
投稿者---BEE(2003/04/22 20:03:30)


初めまして。
C初心者で、今頑張って勉強しております。
そこで質問なのですが、
1 : #include <stdio.h>
2 : #include <stdlib.h>
3 : #define MAX_STR 255
4 :
5 : int main(int argc, char *argv[])
6 : {
7 : char **strings;
8 : int i, num;
9 : num = atoi(argv[1]);
10 :
11 :
12 : for(i = 0; i < num; i++) {
13 : strings[i] = (char *) malloc(sizeof(char) *MAX_STR);
14 : printf("What's new item? \n");
15 : scanf("%s", strings[i]);
16 : }
17 : for(i = 0; i < num; i++)
18 : printf("%s\n", strings[i]);
19 : }
という、mallocを使って、
要求された分だけメモリ領域を確保して、
入力を促し、それを表示させるプログラムなのですが、
coredump となってしまいます。
どこが違うのか、どうしても分からないので、
よろしければご指南よろしくお願いします。

No.5906

Re:mallocを使って…
投稿者---TDa(2003/04/22 21:04:11)



> 13 : strings[i] = (char *) malloc(sizeof(char) *MAX_STR);
>という、mallocを使って、
>要求された分だけメモリ領域を確保して、
>入力を促し、それを表示させるプログラムなのですが、
stringsがさしている領域が確保されていませんね。コマンドラインの処理
等を見ると仕様とコードが違っている気がします。


No.5908

Re:mallocを使って…
投稿者---BEE(2003/04/22 21:27:40)


>stringsがさしている領域が確保されていませんね。コマンドラインの処理
>等を見ると仕様とコードが違っている気がします。

早いご返信ありがとうございます。

13 : strings[i] = (char *) malloc(sizeof(char) *MAX_STR);
これでは、stringsのメモリーを確保したことにならないのでしょうか?

strings = (char *) malloc(sizeof(char) *MAX_STR);
この文を、10、もしくは11行目に移動させると、
確保したことになるのでしょうか?

重ね重ねすみません。

No.5910

Re:mallocを使って…
投稿者---あかま(2003/04/22 23:24:55)


stringsはポインタのポインタですので、
>strings[i] = (char *) malloc(sizeof(char) *MAX_STR);
いきなりこれだと間違っていますよね?

num個分のchar*を確保して、そのポインタをstringsに入れる一文を、10行目に入れてみてください。
それで動くと思います。
それから、mallocで確保したメモリをfreeで解放するのもお忘れなく。


No.5911

Re:mallocを使って…
投稿者---BEE(2003/04/23 00:17:38)


なるほど!
stringsは、ポインタのポインタですから、
一つ目のポインタで、num個分のメモリを確保しなければならないですね。
freeでの解放も了解です。

親切な説明、ありがとうございました。



No.5918

Re:mallocを使って…
投稿者---TDa(2003/04/23 13:28:56)


>stringsは、ポインタのポインタですから、
>一つ目のポインタで、num個分のメモリを確保しなければならないですね。

プログラムの動きを予想するとこんなコードになりそうな気がします。

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

int main(void)
{
    char (*p)[16];
    int i, num;
    
    printf("文字列はいくつ? >");
    scanf("%d", &num);
    p = malloc(sizeof(char [16]) * num);

    for (i = 0; i < num; ++i) {
        printf("文字列を入力 >");
        scanf("%s", p[i]);
    }
    
    printf("=================================\n");
    for (i = 0; i < num; ++i) {
        printf("%d: %s\n", i, p[i]);
    }
    
    free(p);
    return 0;
}


ちなみにchar (*p)[16];と宣言していますがこれとchar *p[16]の違いを
考える事はとっても大事なことなので是非コーディングしていろいろ
試してみることをおすすめします。

char **p; char *p[SIZE]; char (*p)[SIZE]; char p[SIZE][SIZE];
この区別をきちんとしましょう

No.5947

Re:mallocを使って…
投稿者---BEE(2003/04/25 00:19:33)


まさに僕のしたいことですね。
細かい気配り、本当に感謝です。
TDaさんの書かれたプログラムの方が、
僕のものより、視覚的に、格段に分かりやすいですね。

(*p)と*pの違い…。
試してみますね。
初心者発言になりますが、
ちょっとしたところが違うだけで動作が全然異なってくる、
細かいところまで仕上げていく感覚が楽しいですね。