2016-06-30 5 views
0

コード:C++:別の関数から文字列にアクセスする方法はありますか?

#include <cstdio> 

void f() { 
    printf("target_string"); 
} 

int main(){ 
    //any way to access target_string? 
} 

それを達成するためにどのような方法がありますか?


文字列をグローバル変数として定義すれば、簡単に実現できます。

しかし、実際に、私はC++の隠された機能を探求しようとしていると私はちょうどそれが可能であるか...

+0

target_stringはオブジェクトではありません。 'f()'の外に定義してください – Benoit

+0

なぜこれが必要ですか?しかし、通常は変数を使用しています。 – KIIV

+0

多分、非常に特定のコンパイラ/バージョンです。重複した文字列をマージすることができます。しかし、あなたはUBで遊ぶでしょうし、実行された最適化に従ってケースごとに動作するかもしれません(そして小さな無関係なコード変更はそれを壊すかもしれません...)。 「アクセス」とはどういう意味ですか? –

答えて

1

はあなたの小さなプログラムを分解し、あなたの文字列が格納されている場所を見ていないだろうか。文字列が格納されている場合は、関数やコマンドの前後に5バイトを置いて、この情報を使用して文字列の位置を特定します。あなたの文字列を指すポインターを使用し、それにアクセスします。

例:文字列へ

0xff7722: mov eax, 7 #beginn of your function 
... 
0xff7727: #your string 

0xff7727 - 0xff7722 = 5; 

void* pointer = &f; 
f+=5; 

Fポイント。

コンパイラが文字列と関数の間にポインタを置くことにした場合、ポインタが間違った場所を指すことがあります。

+0

素晴らしいアイデア! – Sayakiss

+2

それは信じられないほど痛いです。軽度で無関係な変更は、この仮定を破る可能性があります。コードセグメントと(読み取り専用)データセグメントの間でポインタ演算を行うことができれば、アーキテクチャにも依存します –

関連する問題