C言語関係掲示板

過去ログ

No.1165 コンパイル時の警告について(ポインタ)

[戻る] [ホームページ]
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** ですが。

>どうして警告が出ないのでしょうか?

誤りではないから