void main()
{
int *p=20;
printf("%d\n",*p);
}
このコードは正常にコンパイルされていますが、セグメンテーション エラーが発生しています。gcc コンパイラを使用しています。
私はあなたがそれを考えていると思います
int *p=20;
20の整数値をポインタPにストローしますが、そうではありません。
実際には、poinetr値をアドレス20に初期化しています。また、printステートメントで、許可されていない可能性のある値を逆参照しています。
代わりに以下のコードを試してください
void main()
{
int a=20
int *p=&a;
printf("%d\n",*p);
}
メモリ アドレス 20 へのポインターとして定義しました。次に、構文p
を使用するときにそのアドレスを逆参照しようとしています。*p
アドレス 20 は、アクセスが許可されているメモリの範囲内にある可能性は低いため、セグメンテーション エラーが発生します。
char* i = "abcd";
文字列用のスペースをメモリに確保し、メモリ内のその場所を指すようにコンパイラに指示i
します。あなたはまだメモリ内の場所を変数に割り当てています。
*i
あなたの手段printf
では、 が指す値が必要ですi
。あなたのコメントでは、実際にはを取得しません。abcd
実際には を取得しますa
。これはi
、文字列の最初の文字を指していて、"abcd"
その文字が であるためですa
。
整数を指す方法の例が必要な場合は、次のコードを見てください。
#include<stdlib.h>
#include<stdio.h>
int main() {
int number = 5; //A space in memory, set to the value 5
int* pointer = &number; //A pointer to point to the space in memory
printf("%d\n", *pointer); //Using * to get the value pointed to by pointer
return 0;
}
ポインターは、おそらくあなたのものではないp
アドレスを指しています。呼び出しはそのメモリの内容を印刷しようとしますが、これは許可されていません20
。printf