C言語では、自動ストレージ領域(デフォルトでauto)の変数は、スコープに入るとスタック上に作成され、スコープを出ると自動的に破棄されます。
特徴には以下が含まれます:
正しい使用法と誤った使用法の例:
int* wrong() { int x = 42; return &x; // エラー:xは関数から出ると消えます } void correct() { int y = 123; printf("%d\n", y); // 問題なし }
ローカル変数のアドレスを関数から返した場合、何が起こるでしょうか?
よくある誤った回答: 「ポインタは値を保持します」。
正しい回答: 返されたアドレスは関数を出ると無効になります。メモリ領域は他の自動変数や関数のために再割り当てされます。このポインタを使用することは未定義の動作です。
例:
int* myfunc() { int temp = 10; return &temp; // tempは戻ると消えます } int main() { int* p = myfunc(); printf("%d\n", *p); // 未定義の動作 }
物語
物語
物語
医療レコーダのファームウェアでは、データ処理の高速化のためにスタックでキャッシュが実装されました。負荷がかかるとスタックがオーバーフローし、デバイスの再起動と患者データの損失を引き起こしました。