2

重複の可能性:
ポインターを使用して C の文字列リテラルを変更しますか?

ここにコードサンプルがあります

void main()  
{

    char *i="prady";  printf("%c ",++*i); 
}

「q」を与えるべきだと思うのに、なぜこのコードがgccでセグメンテーション違反を与えるのか誰か教えてください。それのみを使用しているとき*i++は結果が得られますが、プレインクリメントのみの場合、セグメンテーション違反が発生します。

また、void main が関数を記述する適切な方法ではない理由を教えてくださいmain()

4

3 に答える 3

7

++*iを意味し++(*i)ます。文字列リテラルの最初の文字を変更しようとしていますが、これは許可されていません。C 標準に関する限り、動作は定義されていませんが、この実装では、問題を警告するために役立つようにセグメンテーション違反が行われています。

*i++を意味し*(i++)ます。pointer を変更していますがi、これで問題ありません。

void main()mainは関数を記述する適切な方法ではありませmainint。戻り値は、プログラムの成功または失敗を示すために使用されます。実装では の他の形式をサポートできますがmain、必須の と の 2 つがありint main(void)ますint main(int argc, char *argv[])

于 2012-09-28T18:29:03.503 に答える
0

Steve Jessop は、++*i がエラーを返す理由を既に説明しているので、ここでは繰り返しません。

*i++ は単語の最初の文字である p を返します。これは、"++" 演算子が最初に値を返し、値が返された後にのみ値がインクリメントされるためです。したがって、プログラムに 'q' を出力させたい場合は、 と言わなければなりませんprintf("%c ",*i+1)。また、プログラムに 2 番目の文字を出力させたい場合は、以下を試してください printf("%c ", *(i+1))。あなたの単語の3番目の文字の後のアルファベットの次の文字は、などになりますprintf("%c ", *(i+2)+1)

void の代わりに int main を使用する必要があるのはなぜですか? main 関数によって返される値は、プログラムがどのように終了したかをオペレーティング システムに通知します。o (戻り値 0 など) は、プログラムが正しく実行されたことをオペレーティング システムに通知します。通常、エラーのためにプログラムを終了する必要がある場合は、0 以外のコードを使用します。

于 2012-09-28T18:42:59.267 に答える
0
++*i

ポインタを事前にインクリメントすることを意味します。例えば

int *i

*i = 1;

ポイントを逆参照する前に0x8FF43FF0 コンパイルすると、 i がアドレスへのポインタであると想像してください++*ii0x8FF43F4

++(*i)

iインクリメントよりも、最初の逆参照を意味します

于 2012-09-28T18:40:43.937 に答える