このコードが期待どおりに機能しないのはなぜかと思います。スタックは連続的に成長しますか?
typedef char uint8;
int main(int argc, const char * argv[]) {
// insert code here...
uint8 number_1 = 3;
uint8 number_2 = 1;
uint8 *PointerToNumber = &number_1;
printf("%d \n", *PointerToNumber);
++PointerToNumber;
printf("%d \n", *PointerToNumber);
return 0;
}
このプログラムは3と-112を出力します。しかし、スタックが連続的に成長するならば3と1を出力してはいけませんか?
したがって、number_1を指していて、uint8型のポインタアドレスを増やすと、number_2の直後に宣言されていたので、number_2を指すべきではありませんか?
これは、スタックの成長の問題ではなく、コンパイラがローカル変数をどのように配置するかという問題です。 –
2つの変数の間に未使用のバイトが存在する可能性があります。変数が特定の場所や順序に配置されていること、またはまったく含まれていないことが保証されています(使用方法によって最適化できます)。 – Dmitri
ローカル変数がどこにあるかに依存することはできませんが、 'number_2'はおそらく' number_1'の次の低い方のアドレスにあります。 –