4

実行可能ファイルのデータ セクションに文字列を配置する C および C++ コンパイラの規則を見つけようとしていますが、どこを見ればよいかわかりません。次のすべてのアドレスが、仕様によって c/c++ で同じであることが保証されているかどうかを知りたいです。

char * test1 = "hello";
const char * test2 = "hello";
static char * test3 = "hello";
static const char * test4 = "hello";
extern const char * test5; // Defined in another compilation unit as "hello"
extern const char * test6; // Defined in another shared object as "hello"

Windowsでテストすると、それらはすべて同じです。ただし、それらがすべてのオペレーティング システムに搭載されるかどうかはわかりません。

4

4 に答える 4

0

C では、文字列リテラルに関する唯一の保証は、プログラムが未定義の動作に従事していないと仮定して、示された文字の後にゼロバイトが続くメモリの読み取り可能な領域へのポインタとして評価されることだと思います。コンパイラとリンカーは、それを実現するのに適していると思われる方法で連携することが許可されています。これを行うコンパイラ/リンカシステムは知りませんが、コンパイラが各文字列リテラルを独自の定数セクションに配置し、リンカがそのようなセクションを長さの逆順に配置することは完全に正当です。それぞれを配置する前に、適切なバイトシーケンスがすでにどこかに配置されているかどうかを確認してください。バイトのシーケンスは、文字列リテラルまたは定義済みの定数である必要さえないことに注意してください。リンカーが文字列を配置しようとしている場合"Hi!"そして、機械語コードに一連のバイト [0x48, 0x69, 0x21, 0x00] が含まれていることに気付き、リテラルはそれらの最初のものへのポインターに評価される可能性があります。

文字列リテラルが指すメモリへの書き込みは未定義の動作であることに注意してください。さまざまなシステムで、書き込みはトラップされるか、何もしないか、書き込まれたリテラルのみに影響を与える可能性がありますが、まったく予測できない結果をもたらす可能性もあります [たとえば、リテラルが何らかのマシン コードへのポインターに評価された場合]。

于 2013-06-28T17:21:20.433 に答える