C言語関係掲示板

過去ログ

No.415.void point_test(char *pp) { pp = "aiueo"; が変な訳

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

関数間で使用するポインタについて(サンプルつき)
投稿者---しょうじ(2002/10/09 10:45:37)


以下のプログラムを実行しても、正常な値が帰りません。
間違っている点などがあれば教えてください。
お願いします。

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

void point_test(char *pp);

void main()
{
  char str[11];

  point_test(str);

  printf("%s\n",str);
}
void point_test(char *pp)
{

  pp = "aiueo";

}




No.2892

Re:関数間で使用するポインタについて(サンプルつき)
投稿者---a(2002/10/09 10:53:33)


pp = "aiueo"

が間違っています。
ppはアドレスのため

char pp[11];
pp = "aiueo";

という処理をしていることになります。

strcpy(pp,"aiueo");
に変えれば問題なく動くと思います。


No.2894

Re:関数間で使用するポインタについて(サンプルつき)
投稿者---しょうじ(2002/10/09 11:22:31)


ご解答有難うございます。

質問があるのですが、
>char pp[11];
>pp = "aiueo";
になるということですが、

例えば
char *p;
p = "aiueo";

とすれば文字列"aiueo"の先頭アドレスがポインタ変数pに
格納されると思います。
このこととどこが違うのでしょうか。
同じ用に文字列の先頭アドレスを格納しているだけだと思うのですが、
異なる点があれば教えていただけないでしょうか。
お願い致します。


No.2895

Re:関数間で使用するポインタについて(サンプルつき)
投稿者---かずま(2002/10/09 14:45:06)


> 以下のプログラムを実行しても、正常な値が帰りません。
> 間違っている点などがあれば教えてください。

では、プログラムの動作を順を追って見てみましょう。

>   char str[11];

11バイトの場所が確保された。初期化はされていないので内容はゴミ。

>   point_test(str);

str のアドレス(正確には str[0] のアドレス)を引数にして、
関数 point_test を呼び出した。

> void point_test(char *pp)

point_test が呼び出された。pp には、main の str のアドレスが入っている。

>   pp = "aiueo";

pp には、"aiueo" のアドレスが代入された。pp は str のアドレスを失った。
main の配列 str の内容は変更されていない。ゴミのまま。

point_test を終了し、main に戻った。
そして、printf("%s\n",str); でゴミを表示した。

ご理解いただけましたか。

----------------------------------------------------------------------
本来、point_test() の中でやるべきことは、

 pp[0]='a'; pp[1]='i'; pp[2]='u'; pp[3]='e'; pp[4]='o'; pp[5]='\0';

または、

 *pp++='a'; *pp++='i'; *pp++='u'; *pp++='e'; *pp++='o'; *pp++='\0';

または、

 strcpy(pp, "aiueo");

No.2901

Re:関数間で使用するポインタについて(サンプルつき)
投稿者---しょうじ(2002/10/10 11:04:12)


ご返答有難うございました。
おかげで理解する事ができました。

アドレスを格納したポインタ変数にさらにアドレスを
格納しようとしたために最初に格納したアドレスが
無意味になるということですよね。
そのためにアドレスが指し示す場所に値を格納させるということですね。

有難うございました。