-1

簡単なコードを書いたポインターの逆参照に疑問がありますが、特定の状況で失敗する理由がわかりません。誰かが失敗する理由を教えてください。char が *ptr = "stack overflow"ある場合、コンパイラ自体がそれにメモリを割り当てます。

int main()
{
   int *ptr = 10;
   double *dptr = 111.111
   printf("%d", *ptr); //will give segmentation violation as we are trying to access the content in location 10
   printf("%d", ptr);//o/p will be 10 
   printf("%lf", dptr); // will give segmentation violation 
   printf("%lf", *dptr); // will give segmentation violation

}
4

4 に答える 4

3
int *ptr = 10;
double *dptr = 111.111

問題は上記の 2 行にあります。

ptrアドレス10dptr指していて、それがどこを指しているのかわかりません。

これらのポインターを逆参照すると、確かに未定義の動作が発生します..通常はセグメンテーション違反の違反です。

修理:

int main(){
   int iVal = 10; 
   double dVal = 111.11;

   int *ptr = &iVal;
   double *dptr = &dval;

   printf("%d", *ptr); // ok
   printf("%p", (void *)ptr);// ok
   printf("%p", (void *)dptr); // ok
   printf("%lf", *dptr); // ok
   return 0;
}

理論: ポインターは、アドレスを保持する変数です。または、Alexey Frunze が言うように:

C 標準では、ポインターが内部的に何であるか、および内部でどのように機能するかを定義していません。これは、C をコンパイル済み言語またはインタープリター言語として実装できるプラットフォームの数を制限しないようにするための意図的なものです。

ポインター値は、ある種の ID やハンドル、または複数の ID の組み合わせ (x86 セグメントとオフセットへのハローなど) である可能性があり、必ずしも実際のメモリ アドレスであるとは限りません。この ID は、固定サイズのテキスト文字列であっても、何でもかまいません。非アドレス表現は、C インタープリターにとって特に有用な場合があります。

于 2013-03-20T07:14:19.157 に答える
1

あなたがするとき

int *ptr = 10;

アドレス10ptrへのポインタであることをコンパイラに伝えます。このアドレスを逆参照すると、未定義の動作が発生し、クラッシュが発生する可能性があります。

あなたはおそらく次のようなものが欲しいでしょう:

int ival = 10;
int *ptr = &ival;

doubleポインターについても同様です。

于 2013-03-20T07:13:31.780 に答える
0

char *ptr = "スタック オーバーフロー"

  This buffer was allocated in TEXT SEGMENT hence there is no issue of dereferencing and getting the address but if you modify the data content its a voilation [Segmentation Fault]

注:- オンラインで参照してください、プログラム (プロセス) に対していくつのセグメントが作成されますか? [通常、ヒープ セグメント、スタック セグメント、データ セグメント、テキスト セグメント]

于 2013-03-20T07:32:09.123 に答える
0

その理由char *ptr = "stack overflow"は機能し、そうではありint *ptr = 10ません。それ10は単なる数字の 10 ですが"stack overflow"、文字へのポインターに評価されます。

文字列リテラルは特別な種類の定数です。コンパイラは文字列の文字をメモリのどこかに配置し、文字列リテラルの値はそれらの文字へのポインターです。逆に、整数定数と浮動小数点定数は単なる値です。それらはポインターではありません。

于 2013-03-20T10:07:44.993 に答える