2016-04-07 23 views
1

questionを読んだ後、そのようなものは存在しないことを理解しています(少なくとも「ポータブル」ではない)。スタックへのポインタを返す関数を書く方法

static void * 
return_stack_ptr() 
{ 
    gpointer i; 
    return &i; 
} 

私は上記のコードでも、そのような、私は希望のPowerPCとしてアーチ上で動作することを驚いて:私は、スタックへのポインタを返すモノのコードベースから次piece of codeで主演していますが

これはx86(そしておそらくはgccのみ)でしか動かないと仮定しています。

これはPowerPCでも動作しますか?

+1

Cのスタックへのポインタを返すことができる移植可能な関数はありません。移植性の程度はわずかです。 –

+0

この種のものは、プラットフォームとコンパイラに依存します。 –

+0

PowerPC ABIはスタックメモリの概念を持っていますが、コンパイラはスタック以外の別のメモリに変数 'i'を入れることを選択することがあります。それにもかかわらず、私はそれが主流のPowerPCコンパイラで動作すると言いたいと思います。 – atturri

答えて

4

スタックの目的は、関数呼び出しとローカル変数をサポートすることです。あなたのシステムにスタックがある場合は、それを使用してそこにローカル変数を割り当てます。したがって、ローカル変数のアドレスがスタックのどこかを指していると仮定することは非常に合理的です。これはx86やgcc固有のものではありません。これはかなり一般的な考えです。

しかし、存在しない(つまり、スコープから外れた後の)変数へのポインタを使用すると、未定義の動作になります。したがって、この機能は何か意味のあることを保証するものではありません。実際、 "巧妙な"コンパイラは、プログラムが未定義の動作を使用していることを検出し、コードをノーオペレーションで置き換えます(そして、それを "パフォーマンスの最適化"と呼んでいます)。

また、 "賢明な"コンパイラは、関数がスタックへのポインタを返すことを認識し、代わりにハードウェアスタックポインタを使用してインライン展開することができます。

どちらのオプションも保証されていません。このコードは移植性がありません。

+2

一度有効だったポインタを持っているだけの動作は、UB自身ではありません。これは 'free(ptr)'が返された後の通常の状態に過ぎません。 – MSalters

関連する問題