int* func(int *ptr)
{
static int a = 5;
ptr = &a;
return ptr;
}
インタビューで誰かが私にこの質問をしました。ポイントは、変数「a」は静的であるため、関数が戻ると値を失う(スタックからポップされる)宣言された通常の変数とは異なり、この変数は静的であるため値を保持します。
それから私は理解できませんでした、このコードの問題は何ですか?
ptr
パラメータとして持つ意味はありません。渡された値は使用されません。これを次のように変更できます
int* func()
{
static int a = 5;
return &a;
}
問題ありません。a
静的であるため、実行の存続期間を通じて存在します。外部では構文的に見えませんfunc
。「隠された」グローバル変数のアドレスを返しているだけです。
ローカルスコープのコピーを変更しているため、渡す値(指しているアドレス)はptr
関数の外部では変更されていませんptr
変更するには、参照またはポインターからポインターへのポインターで渡す必要があります。
int* func(int **ptr)
{
static int a = 5;
*ptr = &a;
return *ptr;
}
スレッド セーフの問題があります。非定数ポインタを返すと、a
別のスレッドが値を読み取っている間に一部のスレッドが値を変更する可能性があります。データ競合には未定義の動作があります。
また、他の回答で見たことがないので、生のポインターを返すことは恐ろしい習慣です。int& func()
優先する必要があります。