私はコンパイルしようとしているJon Eriksenの本から取られたポインタを使ってこの単純なコードを手に入れましたが、gccは実行時にコンパイルとセグメント化の失敗(コアダンプ)の警告を出します。ポインタに関するCコード
#include<stdio.h>
int main(){
int i;
int int_array[5] = {1, 2, 3, 4, 5};
char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
unsigned int hacky_nonpointer;
hacky_nonpointer = (unsigned int) int_array;
for(i=0; i < 5; i++){
printf("[hacky_nonpointer] points to %p which contains the integer %d\n", hacky_nonpointer, *((int *) hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(int); // hacky_nonpointer = (unsigned int) ((int *) hacky_nonpointer + 1);
}
printf("\n\n\n");
hacky_nonpointer = (unsigned int) char_array;
for(i=0; i < 5; i++){
printf("[hacky non_pointer] points to %p which contains the char %c\n", hacky_nonpointer, *((char *) hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(char); // hacky_nonpointer = (unsigned int *) ((char *) hacky_nonpointer + 1);
}
}
出力:
command line: "gcc -g -o pointer_types5 pointer_types5.c"
pointer_types5.c: In function ‘main’:
pointer_types5.c:16:24: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
hacky_nonpointer = (unsigned int) int_array;
pointer_types5.c:20:103: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
points to %p which contains the integer %d\n", hacky_nonpointer, *((int *) hacky_nonpointer));
pointer_types5.c:20:47: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("[hacky_nonpointer] points to %p which contains the integer %d\n", hacky_nonpointer, *((int *) hacky_nonpointer));
pointer_types5.c:29:24: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
hacky_nonpointer = (unsigned int) char_array;
pointer_types5.c:35:101: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
er] points to %p which contains the char %c\n", hacky_nonpointer, *((char *) hacky_nonpointer));
pointer_types5.c:35:48: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("[hacky non_pointer] points to %p which contains the char %c\n", hacky_nonpointer, *((char *) hacky_nonpointer));
command line: "./pointer_types5"
Segmentation fault (core dumped)
some more info about my os:
uname -a : Linux PINGUIN 4.10.0-33-generiC#37-Ubuntu SMP Fri Aug 11 10:55:28 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
64ビットシステムでは、ポインタのサイズは通常64ビットですが、intのサイズは通常32ビットです。次に、64ビットの値(ポインタ)を32ビットの変数に収める方法について少し考えてみましょう。 –
さらに、%pを使用してprintfを使用する場合は、hacky_pointerの代わりにint_arrayを直接使用する必要があります。 – leyanpan
大変お世話になりました。私はそれをあなたのアドバイスで動作させることができました:私は "unsigned int"から "long unsigned int"に変更し、アドレスが変数に収まるようにしました。また、printf()関数の型キャストを "hacky_nonpointer "(to *(void *)" hacky_nonpointer "へ)。 – IDK