No.15174![]() |
コンパイル時の警告について(ポインタ) 投稿者---Q児(2004/07/03 15:21:18) |
||
コンパイル時、問題のあるポインタの変換(関数 main )と警告が出ます。 どうすればよいか教えてください。 #include<stdio.h> #include<cstdio> void main(void) { char *s1 = "This is a pen."; char *s2 = "That is a pencil."; char *s3 = "It is an apple."; char *dst[100]; char *pt = dst; sprintf(dst, "%s\n%s\n%s\n", s1, s2, s3); while(*pt){ printf("dst = %c\n", *pt); pt++; } } |
No.15175![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---だん(2004/07/03 15:29:16) |
||
#include<stdio.h> #include<cstdio> void main(void) { char *s1 = "This is a pen."; char *s2 = "That is a pencil."; char *s3 = "It is an apple."; char dst[100]; char *pt = dst; sprintf(dst, "%s\n%s\n%s\n", s1, s2, s3); while(*pt){ printf("dst = %c\n", *pt); pt++; } } |
No.15177![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---Q児(2004/07/03 15:59:37) |
||
char *dst[100]; char *pt = dst; ↓ char dst[100]; char *pt = dst; よってコンパイル時の警告が解消したのですが、 なぜ上記の記述では駄目なのでしょうか? |
No.15179![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---επιστημη(2004/07/03 17:00:26) |
||
>char *dst[100]; >char *pt = dst; >... >なぜ上記の記述では駄目なのでしょうか? 型が異なるから。 |
No.15180![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---YuO(2004/07/03 17:07:36) |
||
>なぜ上記の記述では駄目なのでしょうか? char *dst[100]の型がちゃんとわかっていますか? これは,char型のオブジェクトを指すポインタを要素とする,100個の要素からなる配列型です。 sprintfの第一引数はchar *型ですから,dstを渡すことは未定義動作となります。 #式中でdstはchar **型になる。 |
No.15182![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---Q児(2004/07/03 21:56:05) |
||
>dstを渡すことは未定義動作となります。 dstを渡す方が正常に動いています。 char *dst[100]; コンパイル時警告 char *pt = dst; ↓ char dst[100]; コンパイル正常 char *pt = dst; ポインタの配列から ポインタの変数へ格納するには 警告が発生し、 配列からポインタの変数に格納するには 警告が発生しないという事が疑問点です。 ちなみにポインタの変数からポインタの変数へ 格納する場合は警告は発生しません。(下記参照) char *p1; char *p2 = p1; |
No.15185![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---YuO(2004/07/03 22:39:15) |
||
>ポインタの配列から >ポインタの変数へ格納するには >警告が発生し、 >配列からポインタの変数に格納するには >警告が発生しないという事が疑問点です。 T型の配列型を持つ左辺値は,一部の例外を除くと, T型へのポインタ型を持つ,配列先頭要素へのポインタに変換されます。 よって, >char *dst[100]; コンパイル時警告 >char *pt = dst; において,ptを初期化しようとしているのはchar型へのポインタ型へのポインタ型の値になります。 これはchar型へのポインタ型を持つptと異なる型なので,コンパイル時に警告が出ます。 それに対し, >char dst[100]; コンパイル正常 >char *pt = dst; では,ptを初期化しようとしているのはchar型へのポインタ型の値になります。 これはptの型と一致するので正常に動作します。 |
No.15193![]() |
Re:コンパイル時の警告について(ポインタ) 投稿者---επιστημη(2004/07/04 11:21:25) |
||
>char *dst; >char *pt = dst; >ptを初期化しようとしているのはchar型へのポインタ型へのポインタ型の値になると思うのですが、 いいえ。 dst は char* です。 char** ではありません。 char* dst[N] ならば、 dst は char** ですが。 >どうして警告が出ないのでしょうか? 誤りではないから |