1

この C コード行の問題点

char *string()
{
   char *text[20];
   strcpy(text,"Hello world");
   return text;
}

私はポインターが苦手で、これは以前の論文で見たことがあります。解決できません。

4

2 に答える 2

7

文字ポインターの配列を単一の文字配列として扱うため、コンパイルされません。

変数宣言行は次のようになります。

char text[200];

その修正が完了しても、おそらく興味がある理由でまだ壊れています。関数が返すときにスコープ外にtextなるローカル変数 (文字配列)のアドレスを返すため、アドレスが無効になります。これには 2 つの方法があります。

  1. 最も簡単な方法は、配列を作成staticすることです。これにより、プログラムが実行されている限り有効になります。
  2. を使用して動的 (ヒープ) メモリに切り替えることもできますmalloc()が、所有権が呼び出し元に転送され、呼び出しが必要にfree()なるか、この関数が頻繁に呼び出されるとメモリ リークが発生します。

また、マイナーな点として、その名前は予約済みの名前空間にあります (ユーザー プログラムは、名前が で始まる関数を定義できませんstr)。また、引数を取らない関数(void)は C のように宣言する必要があります。空の括弧のペアは同じことを意味しません。

于 2013-10-28T10:47:52.743 に答える