0

重複の可能性:
char a[] = “string”; の違いは何ですか? および char *p = 「文字列」;

この質問をどこかで読みました。

char buf[]="hello";
char *buf="hello";
In terms of code generation, how do the two definitions of buf, differ?

これには4つのオプションがあり、私はマークしました

The first definition certainly allows the contents to buf to be safely modified at runtie; the second definition does not.

しかし、結局のところ、クイズマスターは次のことを正解としてマークする必要がありました。

They do no differ-- they are functionally equivalent

2番目のケースではできないのに、最初のケースではできるので、なぜ私の選択が間違っているbuf[3]='t'のですか?

ありがとう。

4

1 に答える 1

-2

Cの文字列リテラルの「寿命」について知らなかったので、私の答えは有効ではありません。

私の答え:

ポインター型とベクトル/行列型は、メモリ管理が処理されている限り交換可能です。内部では、コンパイラはベクトル/行列のインデックス操作をポインター演算に切り替えます。

buf[3] == *(buf+3)

この特定のケースでは、コンパイラは文字列の長さをカウントし、ベクトル/マトリックスとポインターの両方にメモリを割り当て (スタック) ます。

それ以外の場合は、ベクトル/行列を使用する方法で安全に使用するために、ポインターに手動でメモリを割り当てる必要があります。ただし、長さを指定する必要があるため、ベクトル/マトリックスにも構文的に同じことが当てはまりますchar buf[5]。手動のメモリ割り当てほど冗長ではありませんが、指定する必要があります。

編集:

上記の回答は、ほとんどの場合、ポインターとベクトル/マトリックスは機能的に交換可能ですが、基本的な構造が異なるという事実を説明しています (ポインターには、アドレスを格納するための追加のメモリ位置が必要です)。

また、文字列リテラルの場合、それらは割り当てられ、プログラムの存続期間全体にわたって一定であるため、メモリ割り当てを使用せずにそれらへのポインターが有効であり続けます。

于 2012-10-24T11:18:36.600 に答える