-2
void main()
{ 
    int *p=20;
    printf("%d\n",*p);
}

このコードは正常にコンパイルされていますが、セグメンテーション エラーが発生しています。gcc コンパイラを使用しています。

4

3 に答える 3

3

私はあなたがそれを考えていると思います

int *p=20;

20の整数値をポインタPにストローしますが、そうではありません。

実際には、poinetr値をアドレス20に初期化しています。また、printステートメントで、許可されていない可能性のある値を逆参照しています。

代わりに以下のコードを試してください

void main()
    { 
        int a=20
        int *p=&a;
        printf("%d\n",*p);
    }
于 2012-08-08T08:40:02.620 に答える
3

メモリ アドレス 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;
}
于 2012-08-08T08:26:49.800 に答える
2

ポインターは、おそらくあなたのものではないpアドレスを指しています。呼び出しはそのメモリの内容を印刷しようとしますが、これは許可されていません20printf

于 2012-08-08T08:27:09.170 に答える