2017-12-25 20 views
-2

私はこのプログラム実行しています:pointCharと*(ポインタ+ 1)*出力と同じ結果を同じCのポインタが異なる値を示していますか?

#include<stdio.h> 

void main(){ 
    int num = 1025; 
    int *poinTer = &num; 
    char *pointChar = poinTer+1; 
    *pointChar = 'A'; 

    printf("Size of Integer: %d\n", sizeof(int)); 
    printf("Address: %d, Value: %d\n", poinTer, *poinTer); 
    printf("Address: %d, Value: %c\n", poinTer+1, *(poinTer+1)); 
    printf("Address: %d, Value: %c\n", pointChar, *pointChar); 
} 

をすべきであるが、私は取得しています出力が異なっています。 * pointCharは値を出力しません:

Size of Integer: 4 
Address: 1704004844, Value: 1025 
Address: 1704004848, Value: A 
Address: 1704004673, Value: 

ここには何が起こっていますか?

+5

は未定義の動作です:)表現ポインタ+オブジェクトNUMを超えても1ポイント。 –

+2

また、あなたはポインタに変換指定子%dを使用しなくてもよいのchar * pointChar =(char型*)ポインタ+ 1 –

+0

を意味するようです。 –

答えて

3

ポインタで+ 1を実行すると、必ずしもメモリアドレスが1増加するとは限りません。sizeof(*ptr)で増加します。この場合

poinTer + 1(char*)poinTer + sizeof(int)と等価です。これは実際に配列を扱うのをはるかに容易にします。

古き良きptr[i]

*(ptr + i)のためのシンタックスシュガーです。したがって、10の整数の配列を持つ場合、 ptr[4]は、ベースアドレスから4バイトではなく5番目の要素を指します(整数は一般に4または8バイトです)。

それでは、あなたが実際にやったことです:

  1. は、スタック上に(numintを作成し、値1025
  2. スタックにint*poinTer)を作成し、その割り当てを与えましたメモリアドレスnum
  3. sizeof(int)(意図せず別のメモリアドレスを指している)によってポインタをインクリメントした後、それをchar*にキャストし、それを新しいポインタに割り当てます。バイトを割り当て
  4. この新しいメモリアドレス値65'A')で指さ。

これは、あなたがやりたいことはおそらくです:ここでは

#include<stdio.h> 

void main(){ 
    int num = 1025; 
    int *poinTer = &num; 
    char *pointChar = (char*)poinTer + 1; 
    *pointChar = 'A'; 

    printf("Size of Integer: %d\n", sizeof(int)); 
    printf("Address: %d, Value: %d\n", poinTer, *poinTer); 
    printf("Address: %d, Value: %c\n", (char*)poinTer + 1, *((char*)poinTer+1)); 
    printf("Address: %d, Value: %c\n", pointChar, *pointChar); 
} 
+0

これを明記していただきありがとうございます。ポインタが実際にメモリに格納される方法と実際は混乱しています。私は彼らがちょうど正しいと思われない整数として保存されていると思った。彼らはタイプも含んでいるようです。 –

+0

@KshitijKumarコンパイラの中に*型があります。... –

+0

@AnttiHaapalaがそれを手に入れました。私は今良い詳細を理解しました。私はもう少し疑いがある。 char * pointChar =(char *)poinTer + 4;未定義のメモリ領域につながるでしょうか?最初はintegerに4バイトを予約していたので、+ 3に変更することができますが、そのコンパイラはランダムなメモリを与えますか? –

関連する問題