2016-12-29 6 views
0
#include <stdio.h> 
struct test 
{ 
    int a; 
    char b; 
    int c; 
}; 
int main() 
{ 
    struct test *ptr = (struct test *)0; 
    ptr++; 
    fprintf(stderr, "by pointer = %zd\n", (size_t) ptr); 
    fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test)); 
    return 0; 
} 
+2

それはウル疑問を明確に願っています質問は何ですか? – e0k

+0

ポインターが0に割り当てられた場合、ポインターがない – samgak

+0

ポインターのサイズであることが保証されているuintptr_tへのポインターを常にキャストすることが常にベストです。 'size_t'はそれに適合することが保証されていません –

答えて

2

ptrは、が定義されていません。です。

(size_t)ptrは、の実装がと定義されていることに注意してください。 size_tへのポインタをキャストするのは常に有効ですが、結果をsize_t型で表現できない場合、その動作は未定義です。

C標準ではポインタを0に設定できますが、ポインタの算術演算は配列内でのみ有効です。ただし、配列の末尾よりも1つ先に、またはスカラーのアドレスより先にポインタを置くことができます。 sizeofタイプの正しい書式指定子が%zuであることを

注 - 他には、あなたも多くの未定義の動作の可能性を持っています。

+0

しかし、このコードは動作していますが、私はそのポイントptr ++を得ていませんか?正しいサイズの構造体を与える –

+1

これは未定義の動作の性質です。それは、コンパイラがあなたの猫を食べるかもしれない他の日に動作するように見えるかもしれません。 – Bathsheba

+0

ポインタから整数への変換は、実装定義です。 – 2501

-1

ポインタのタイプは「struct test」です。これはここで起こっていることです。

1)「PTR」はポインタであるため、「PTR ++」は、構造体の試験のサイズによってメモリロケーションを増加させるであろうuは:)言うことができるメモリ位置「0」(NULLポインタ)

2)に割り当てられています構造体の型。したがって、アドレス "12"を指すようになりました。

3)sizeof(構造体)はパディングのために12を与えます。 (3バイトはchar変数に埋め込まれているので、9を与えるべきであるが、12を与えているように見える)

これで、少し変更することができます。

#include <stdio.h> 
struct test 
{ 
    int a; 
    char b; 
    char d; 
    int c; 
}; 
int main() 
{ 
    struct test A; 
    struct test *ptr = (struct test *)0; 
    ptr++; 
    fprintf(stderr, "by pointer = %zd\n", (size_t) ptr); 
    fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test)); 

    ptr = &A; 
    fprintf(stderr, "by pointer = %zd\n", (size_t) ptr); 
    fprintf(stderr, "by sizeof = %zd\n", sizeof(struct test)); 
    return 0; 
} 

これはuが得られます出力されます。

by pointer = 12 
by sizeof = 12 
by pointer = 140737488347632 
by sizeof = 12 

私は

関連する問題