私はrpcgenチュートリアルに従って、クライアントがサーバーに要求を送信し、サーバーがデータ形式の文字列で応答する小さな「リモートプロシージャコール」ユーティリティを作成しています。戻り文字列は、strftime() char配列を使用し、フォーマットされた時刻で埋めることによって作成されます。次に、tまたはsのchar配列が* ptrに割り当てられ、whoesアドレスがreturn(&ptr)として返されます。不思議なことに、静的文字を使用すると、関数が機能し、正しい文字列を受け取ることができます。ただし、非静的文字s [100]を使用する場合返された文字列を使おうとすると、文字化けした混乱やランダムな文字と非文字が表示されます。非静的の場合、私はそれを再度書き直さないのに、なぜそれをしているのですか?また、関数定義の戻り値がダブルポインター**であることの意味はわかりませんが、実際には&ptrを使用してシングルポインター*を返します。
char **menuitem_1_svc(char *argp, struct svc_req *rqstp)
{
struct tm *timeptr;
time_t clock;
static char *ptr;
static char err[] = "Invalid Response \0";
char t[100];
static char s[100];
clock = time(0);
timeptr = localtime(&clock);
//Use static char[] s or char[] t both seem to work here
strftime(s,100,"%A, %B %d, %Y - %T",timeptr);
/* This block is just an example. ptr is only assigned to s or t.
//This works
ptr =s;
//This doesn't
ptr = t;
*/
return(&ptr);
}
これは、t
が非静的(スタックに割り当てられている)であるために発生します。つまり、関数が戻るとメモリが解放され、そのメモリを参照するときには何でもかまいません。この動作は定義されていません。
これはよくある間違いであり、ローカル変数へのポインタや参照を返さないでください。
static
変数はスタックではなくグローバルメモリに割り当てられるため、変数に対して機能します。静的変数へのポインタと参照を返すことは、機能している間はアンチパターンであり、避ける必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加