【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.23158

ポインタ配列について
投稿者---つよし(2005/09/19 23:43:52)


入力した文字列をポインタ配列に格納し、格納した文字列を表示しています。
scanfで受け取った文字列をポインタ配列の指定した所に入れているのですが
上手くできません。正しく格納が行えません。
どこがいけないのでしょうか。

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

main()
{
    char *data[5];
    char str[64];
    int  i=5 ;

    for (i=0; i<5; i++) {
        printf("文字列を入力してください");
        scanf("%s",str);
        strcpy(data[i,str);
    }

    for (i=0 ; i<5; i++) {
        printf("data[%d] = %s\n",i,data[i]);
    }
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:ポインタ配列について 23160 まきじ 2005/09/19 23:50:16


No.23160

Re:ポインタ配列について
投稿者---まきじ(2005/09/19 23:50:16)


>char *data[5];

data の要素に、領域が確保されていない。


この投稿にコメントする

削除パスワード

No.23168

Re:ポインタ配列について
投稿者---つよし(2005/09/20 13:12:46)


>>char *data[5];
>
各要素に領域が確保されていないため、コピーしようにもコピー先の
アドレスがないから上手くいかないのですね。

以下の様な感じでしょうか。
malloc関数で領域を確保してみました。一応、動きました。

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

main()
{
    char *data[5];
    char str[64];
    int  i=5 ;

    for (i=0; i<5; i++) {
        printf("文字列を入力してください:");
        scanf("%s",str);
        data[i]=malloc(64);
        strcpy(data[i],str);
    }

    for (i=0 ; i<5; i++) {
        printf("data[%d] = %s\n",i,data[i]);
        free(data[i]);
    }
}


mallocで領域を確保していますが、例えば、別の変数のアドレスを設定
することもできるのでしょうか。

main()
    char *data[5];
    char wk1[10];
    char wk2[10];
    char wk3[30];
    char wk4[64];
    cahr wk5[64];

    data[0] = wk1;
    data[1] = wk2;
    data[2] = wk3;
    data[3] = wk4;
    data[4] = wk5;
}



この投稿にコメントする

削除パスワード

No.23169

Re:ポインタ配列について
投稿者---Blue(2005/09/20 13:19:48)


> mallocで領域を確保していますが、例えば、別の変数のアドレスを設定
> することもできるのでしょうか。
できます。
しかし、一つ一つ設定するのを考えると、2次元配列にしたほうがいいでしょう。

char data[ 5 ][ 64 ];



この投稿にコメントする

削除パスワード

No.23173

Re:ポインタ配列について
投稿者---つよし(2005/09/20 20:08:37)


まきじさん、Blueさんありがとうございます。

しかし、ポインタ配列で渡さなくてはいけないので2次元配列は
使えません。



この投稿にコメントする

削除パスワード

No.23178

Re:ポインタ配列について
投稿者---Hermit(2005/09/20 21:49:29)


>しかし、ポインタ配列で渡さなくてはいけないので2次元配列は
>使えません。

確保する領域が、64 固定だったから書いただけじゃないかな?

普通、不要な部分まで malloc しないので、文字列の場合
strdup() とかを使います。

【書式】

#include <string.h>
char *strdup(const char *s);

strdup()は文字列sを保存するためのメモリをmalloc(3)を使ってヒープ上に
確保し、そこに文字列sをコピーします。

【リターン値】

文字列sを保存したアドレスを返します。メモリの確保に失敗するとNULLを
返します。

こんな感じで実装されているかな?
char *strdup(const char *str) {
char *ret = malloc(strlen(str) + 1);
return ret ? strcpy(ret,str) : ret;
}



この投稿にコメントする

削除パスワード

No.23184

Re:ポインタ配列について
投稿者---つよし(2005/09/20 23:44:28)


>普通、不要な部分まで malloc しないので、文字列の場合
>strdup() とかを使います。

もちろん、領域の開放は必要ですよね。
要素毎に必要ですか。


この投稿にコメントする

削除パスワード

No.23185

Re:ポインタ配列について
投稿者---まきじ(2005/09/20 23:54:06)


>もちろん、領域の開放は必要ですよね。
>要素毎に必要ですか。

「しなければならない」ということは無いですが。

要素一つ一つに対して、malloc() してるのですから、
全要素に対して free()すれば良い。


この投稿にコメントする

削除パスワード

No.23187

Re:ポインタ配列について
投稿者---つよし(2005/09/21 00:19:59)


>要素一つ一つに対して、malloc() してるのですから、
>全要素に対して free()すれば良い。

このような感じでしょうか。

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

main()
{
    char *data[5];
    char str[64];
    int  i=5 ;

    for (i=0; i<5; i++) {
        printf("文字列を入力してください:");
        scanf("%s",str);
        data[i]=strdup(str);
    }

    for (i=0 ; i<5; i++) {
        printf("data[%d] = %s\n",i,data[i]);
    }
    free(data);
}




この投稿にコメントする

削除パスワード

No.23188

Re:ポインタ配列について
投稿者---RiSK(2005/09/21 00:38:45)


>>全要素に対して free()すれば良い。

data[0]〜data[4]までfreeしないと意味無いでしょうに。


この投稿にコメントする

削除パスワード

No.23189

Re:ポインタ配列について
投稿者---つよし(2005/09/21 01:43:29)


>>>全要素に対して free()すれば良い。
>
>data[0]〜data[4]までfreeしないと意味無いでしょうに。

すみません。
捉え違いしていました。
全要素ということで、てっきり、dataだけをfreeすれば、解放される
と勘違いしました。
「*data[]」は、[]の方が*よりも優先ですからすでに領域はあります。





この投稿にコメントする

削除パスワード

No.23190

Re:ポインタ配列について
投稿者---つよし(2005/09/21 01:45:43)


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

main()
{
    char *data[5];
    char str[64];
    int  i=5 ;

    for (i=0; i<5; i++) {
        printf("文字列を入力してください:");
        scanf("%s",str);
        data[i]=strdup(str);
    }

    for (i=0 ; i<5; i++) {
        printf("data[%d] = %s\n",i,data[i]);
        free(data[i]);
    }
}

ですね。


この投稿にコメントする

削除パスワード

No.23331

Re:ポインタ配列について
投稿者---O(2005/09/27 11:59:50)


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

main()
{
char *data[5];
char str[64];
? int i=5 ;

for (i=0; i<5; i++) {
printf("文字列を入力してください:");
scanf("%s",str);
data[i]=strdup(str);
}

for (i=0 ; i<5; i++) {
printf("data[%d] = %s\n",i,data[i]);
free(data[i]);
}
}
</pre>
>ですね。



この投稿にコメントする

削除パスワード

No.23334

Re:ポインタ配列について
投稿者---Blue(2005/09/27 12:05:39)


リモートホストが

http://www2.realint.com/cgi-bin/tarticles.cgi?pointc+23192

の ユウ氏 と同じですが。
なんか聞きたいことあるのですか?


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧