次のような C プログラムを作成しています。グローバル ポインターが指す変数に値を代入しています。この変数は、代入の右側の関数呼び出しによって変更されています。
しかし、変更は以前に指していた場所に発生します。したがって、次のコードの場合、出力されます
"GP:5 P:5 GPV:11" ,
どこにあるべきか
「GP:10 P:10 GPV:9」
-O2 と -O0 の両方でコンパイルしてみました。同じ出力。
割り当てを2行に分割するだけで修正されることがわかっています。しかし、私が取り組んでいるプロジェクトには、このような場所がたくさんあります。
これは、2行に分割せずに希望どおりに機能させることは可能ですか?
どんな提案でも大歓迎です。
#include <stdio.h>
int * gp;
// volatile int *gp; // I tried these two.
// int * volatile gp; // Didn't help.
int func(int *p)
{
*p = 5;
gp = p;
return *p;
}
int main()
{
int p = 7;
int gp_v;
gp = &gp_v;
*gp = 8;
*gp = func(&p) + *gp;
gp_v ++;
printf("GP:%d P:%d GPV:%d\n", *gp, p, gp_v);
return(0);
}