回答受付が終了しました

C言語 char * str = "abc"; printf("str =%c\n", *(str + 1));

C言語関連55閲覧

回答(5件)

0

何がおかしいというならば、int型へのポインタで文字列を指そうとするのがいちばんオカシイわけですが…。 ポインタに対する加減算には「重み付け」がされるからです。 int型へのポインタに対して+1すると、実際には4ないし8加算されることになります。要するにsizeof(int)*1が、実際には加えられるわけです。 今回のケースでは、これによって「領域外へのアクセス」が生じ『意味のない値』を拾ってしまったのです。 …って、どこかで見覚えのある質問だなぁw

0

『intだと+1だと 変な文字が表示されるという認識でいたのですが』 『intにするとsと出力されます。』 無事に想定通り変な文字が出力されています。 『*(str+1)の部分を+2や+4などに変更してもbが表示されません』 +1で領域を超えて変な文字が出ると分かっているのに、 なぜ、+2や+4と更に先の領域を表示したら、bが出ると判断したのでしょう? ポインタとは、型を持ったアドレスであり、ポインタに対する演算は型を考慮した演算(ポインタ演算)が行われる事を理解する必要があります。 教科書のポインタ演算の項目を読み直して下さい。

0

int* str; と宣言しているとき、 str + 1 は str が指すアドレスに sizeof( int ) つまり、恐らく 4 byte が加算されています。 つまり str が指すアドレスが10000 だとすると、 (char*)str == 10001 ですし、 (int*)str == 10004 となります。 そのため、int*の加算は 4byte 単位なので b は表示できません。 's' が出力されるのは 'a' 'b' 'c' '\0' 's' 't' 'r' ' ' '=' ... と並んでいるメモリ上のデータの 'a' の 4byte 後の文字を表示しているためだと思われます(単なる推測のためそうでない可能性も十二分にある)。 どうしても 'b' を表示したいなら (char*) 型にキャストするのがいいと思います。

0

>charは1byte intは2byteまたは4byteだから >charだと+1で次の文字をみにいけるけど、 >intだと+1だと変な文字が表示されるという認識でいた 違います。 int*型の値に+1するとint型のサイズ分進んだバイトを指すポインタの値となります。 つまり、 (char *)(p + 1) == (char *)p + sizeof(*p) (char *)(p + n) == (char *)p + sizeof(*p) * n ということです。

実験 #include <stdio.h> int main(void) { __int * str = "abcdefghijklmnopqrstuvwxyz"; __printf("str + 1 = %p\n", str + 1); __printf("(char *)str + sizeof(*str) = %p\n", (char *)str + sizeof(*str)); __printf("*(char *)(str + 1) = %c\n", *(char *)(str + 1)); __printf("*((char *)str + sizeof(*str)) = %c\n", *((char *)str + sizeof(*str))); __return 0; }