ポインタの increment にハマった日

 int型のポインタを1つ加算・減算すると、IA-32 では int が 4byte (32bit) なので 4byte分 加算・減算される。 void型やchar型の場合は 1バイト (8bit) 分 加算・減算される。 っていうことをすっかり忘れて int 型へのポインタ変数で次の配列を取得するときに ptr += num * sizeof(int); とかしてしまって、実際は配列の3つ先をさすポインタになってしまって、配列長の4分の1を過ぎたあたりから Segv ったりしだして。 それに気づくのに少し時間がかかったり。 同様なのですが、IA-32 では long型へのポインタの場合は 4byte (32bit)、long long 型へのポインタは 8byte (64bit) になります。


以下、確認したときの手順:


$ uname -srm
Linux 2.4.26-co-0.6.1 i686

$ cat ptr++.c
#include <stdio.h>

int
main (int argc, char** argv)
{
int a, *p_int;
void *p_void;
char *p_char;
p_int = &a;
p_void = (void*)&a;
p_char = (char*)&a;
printf("sizeof(int)=%d, sizeof(void)=%d, sizeof(char)=%dn",
sizeof(int), sizeof(void), sizeof(char));
p_int++; p_void++; p_char++;
printf("%p -> p_int=%p, p_voi=%p, p_char=%pn",
&a, p_int, p_void, p_char);
return 0;
}
$ gcc ptr++.c -o ptr++
$ ./ptr++
sizeof(int)=4, sizeof(void)=1, sizeof(char)=1
0xbffffda4 -> p_int=0xbffffda8, p_voi=0xbffffda5, p_char=0xbffffda5

コメント

このブログの人気の投稿

大型特殊自動車免許を取った時の話。

パスワードを覚えるのも無理があるから、パスワードマネージャ使いましょう。

車両系建設機械運転者(整地) の講習