-2

質問がありますが、取得している出力について少し混乱しています。誰かがこれで私を助けてくれませんか。

`

#include <stdio.h>

int main()
{
  int *i = 5;
  char *c = i[1];
  printf("%c", *c);
}

`

エラーなしで適切にコンパイルされますか。コンパイルすると、実行時にセグメンテーション違反が発生しますか。はいの場合、どの行が原因ですか。私によると、main() の最初の 2 行は問題ありません。printf ステートメントでセグメンテーション違反が発生しますが、それを正当化することはできません。ここで int *i は定数に初期化されます。したがって、「i」で別の場所を指すことはできますが、*i を変更することはできません。「i」の 2 番目のバイトを char *c に割り当てていますが、ここでは *i を変更していません。次に、 *c を印刷するとセグメンテーション違反が発生する理由。これが私の見解です。より良い説明を探しています。

4

4 に答える 4

2

そうint *i = 5;することで、ポインタが無効なメモリアドレスを指すようになります。ポインター演算を行わず、逆参照しない限り、それで問題ありません。

char *c = i[1];実行することで、そのポインター (指しているオブジェクトが配列ではない) に対してポインター演算を実行し、逆参照することさえできます。どちらも、未定義の動作を呼び出していることを意味します。同時に、無効なメモリ アドレスを指す別のポインタの初期化を宣言します。

を実行printf("%c", *c);すると、無効なポインター アドレスが再度参照解除され、未定義の動作が再び呼び出されます。つまり、セグメンテーション違反を含め、あらゆることが発生する可能性があります。

このような形式の悪意のあるコードを認識し、それ以上の実行を拒否するオペレーティング システムで実行しているため、セグメンテーション違反のみが観察されることに注意してください。未定義の動作が失敗するとは限りません。そして問題は、コンパイラがコードのそのような問題について通知する必要がないということです。

于 2012-07-17T20:10:43.593 に答える
1

int *i = 5;数値 5 のアドレスではなく、アドレス5を指すポインターを作成します。次のようにする必要があります。

int a = 5;
int *i = &a;

また、iは へのポインタであるintため、次の動作は未定義です。

char *c = i[1];
//        ^ returns an int, not a char pointer
于 2012-07-17T20:07:58.467 に答える
0

静的な値からポインターを初期化することはできません。コードはiメモリ address を指すように初期化されます5が、これは確かにアプリケーションのメモリではありません。やりたいことをするには、これが必要です:

int x = 5;
int* i = &x;

値を保持するintの&アドレスを取得する演算子のアドレスです。2行目に関しては、それは完全に無効です。配列であっても、演算子をサポートしない likeへのポインター。次のいずれかが必要です。x5int[]

  • の値i:*i
  • の最初のバイトi: 正当な理由がない限り試さないでください

次に、その値をポインタに代入しますが、これも無効です。再度使用する必要があります&

于 2012-07-17T20:12:22.677 に答える
0

コードにはいくつかの問題があります。

int *i = 5;

アドレス5でポインタiを初期化しています。これには少なくともいくつかの問題があります。まず第一に、最新のアーキテクチャ (x86 など) のほとんどは、偶数アドレスから始まるようにマルチバイト型を整列することを主張しています。第 2 に、5 は非常に低いアドレス値であり、プラットフォームによってはプログラムで使用できない場合があります (無効なアドレスになります)。int

char *c = i[1];

ここで、ポインターを宣言し、次の整数アドレス(7 または 9 またはその他のアドレスのいずれか)に格納されている整数charの値で初期化しています。これは、上記で説明したように既に問題があります。これ自体がセグメンテーション違反を引き起こす可能性があります。 )。入力の問題 (式の型はではなく) を超えて、 の内容が有効なメモリ アドレスに対応しないランダムなビット文字列であることがほぼ保証されます。ii[1]intchar *i[1]

printfこれが、ステートメントでセグメンテーション違反が発生する理由です。*c無効なポインターを逆参照しようとしています。

いいえ、最初の 2 行はmain間違いなく問題ありません。

于 2012-07-17T20:25:14.900 に答える