静的char配列と動的char配列の奇妙な動作

フランク

私は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]

編集
0

コメントを追加

0

関連記事

分類Dev

char配列を単一のcharに割り当てるという奇妙な動作

分類Dev

文字をchar配列にコピーすると、奇妙な動作が発生するのはなぜですか

分類Dev

char *の参照を解除するときの奇妙な配列/ポインタの動作

分類Dev

Javaの奇妙な配列の動作

分類Dev

C ++の奇妙な配列の動作

分類Dev

PHP連想配列の奇妙な動作

分類Dev

Matlab配列での奇妙な動作

分類Dev

C配列での奇妙な動作

分類Dev

PowerShell、Get-WinEvent -FilterHashTableIDと配列の奇妙な動作

分類Dev

論理配列を変更するときの奇妙な動作

分類Dev

asp.netとjavascript配列の奇妙な動作

分類Dev

strtokとfgetsを使用した奇妙な配列の動作

分類Dev

javascriptで配列を作成するときの奇妙な動作

分類Dev

useStateを反応させる-useStateと配列の奇妙な動作

分類Dev

C#配列とRandom.NextDouble()での奇妙な動作

分類Dev

char配列のrealloc動的配列

分類Dev

静的メソッドで配列Javaをコピーするときの奇妙な動作

分類Dev

char配列への動的な読み取りと保存

分類Dev

cの動的配列と静的配列

分類Dev

Cで文字列配列の要素を出力するときの奇妙な動作

分類Dev

C の文字列配列の奇妙な動作

分類Dev

Cの文字列の配列、奇妙な動作

分類Dev

静的constのstd :: stringとchar配列

分類Dev

静的constのstd :: stringとchar配列

分類Dev

膨大な配列を持つCodePenでの奇妙なJavaScriptの動作

分類Dev

大きな配列でのC ++ / CUDAの奇妙な動作

分類Dev

初期化されていない配列と設定されていない配列の奇妙な動作

分類Dev

Cの別の配列に基づくchar配列の奇妙な長さと内容

分類Dev

配列のリストでのContains()の奇妙な動作

Related 関連記事

  1. 1

    char配列を単一のcharに割り当てるという奇妙な動作

  2. 2

    文字をchar配列にコピーすると、奇妙な動作が発生するのはなぜですか

  3. 3

    char *の参照を解除するときの奇妙な配列/ポインタの動作

  4. 4

    Javaの奇妙な配列の動作

  5. 5

    C ++の奇妙な配列の動作

  6. 6

    PHP連想配列の奇妙な動作

  7. 7

    Matlab配列での奇妙な動作

  8. 8

    C配列での奇妙な動作

  9. 9

    PowerShell、Get-WinEvent -FilterHashTableIDと配列の奇妙な動作

  10. 10

    論理配列を変更するときの奇妙な動作

  11. 11

    asp.netとjavascript配列の奇妙な動作

  12. 12

    strtokとfgetsを使用した奇妙な配列の動作

  13. 13

    javascriptで配列を作成するときの奇妙な動作

  14. 14

    useStateを反応させる-useStateと配列の奇妙な動作

  15. 15

    C#配列とRandom.NextDouble()での奇妙な動作

  16. 16

    char配列のrealloc動的配列

  17. 17

    静的メソッドで配列Javaをコピーするときの奇妙な動作

  18. 18

    char配列への動的な読み取りと保存

  19. 19

    cの動的配列と静的配列

  20. 20

    Cで文字列配列の要素を出力するときの奇妙な動作

  21. 21

    C の文字列配列の奇妙な動作

  22. 22

    Cの文字列の配列、奇妙な動作

  23. 23

    静的constのstd :: stringとchar配列

  24. 24

    静的constのstd :: stringとchar配列

  25. 25

    膨大な配列を持つCodePenでの奇妙なJavaScriptの動作

  26. 26

    大きな配列でのC ++ / CUDAの奇妙な動作

  27. 27

    初期化されていない配列と設定されていない配列の奇妙な動作

  28. 28

    Cの別の配列に基づくchar配列の奇妙な長さと内容

  29. 29

    配列のリストでのContains()の奇妙な動作

ホットタグ

アーカイブ