メモリの問題--グローバル変数が変更されました


一、出会った問題
1)シナリオ説明:クラスでグローバル変数aを定義し、クラスの初期化時に初期値a=10を与える.この変数は他のクラスに外部参照されていますが、外部参照はこの値のみを使用し、値は変更されません.この変数は、1つのTimerで1秒間に1回印刷されます.2)見られる現象:この変数a期初めはずっと10を出力していたが,突然ある時点でこの値は0になった.
二、私が考えている問題の原因
私はこのような現象を見て、頭の中で考えずに以下の2つの原因を考えました:1)変数aの値を変える人がいるに違いありません.答えは肯定的で、そのクラスが初期化されたときに変数に一度値を与えただけで、他の場所にはありません.2)その変数を持つオブジェクトが破棄されたため,その値は0となる.答えは明らかで、自習して問題を読むと、このような現象は起こり得ないことがわかります.それはグローバル変数であり、どのオブジェクトに属していないからです.
三、本当の原因
他のスレッドのオブジェクトmallocスタックのメモリ領域がある場合、グローバル領域の変数のアドレスが占有されるためです.すなわち,スタック空間はグローバル変数領域のアドレスの一部を占有している.
これについて、テストを行いました.
char mycha[1024*10]; //   10K   
double a;

init(){
a = 10;
memset(mocha,'a',1024*10);
}

timer(){
    printf("%f",a);
    printf("%s",mycha);

    judge();
}


judge(){
    if(mycha[0] != 'a'){
        NSLog(@"       ");
    }
}

私たちは印刷を通じて発見しました:mychaはその後本当にaaaではありません......、それは本当に変えられました.mychaとaの位置が隣接しているため、aの値が変化し、メモリアドレスが破壊されたに違いない.
確認:watch change(Xcodeでdebug機能)a変数により、aをどこで変えたのかを発見することができます.これでよく位置決めできます.
四、結びの言葉
非常に厄介な問題(例えば、この問題について、まる2日間探した)は非常に低級な間違いによるものかもしれません.だから、コードを書くときは眠くてはいけません.プログラミング規範に背いてはいけません.