配列を返す関数があるとしましょう。
int *theFunction()
{
int a[]={1,2,3,4,5};
return a;
}
関数の結果をポインタに格納したい。
int *a=theFunction();
配列を印刷するにはどうすればよいですか? 配列の長さがわからないのですが、それを見つける方法はありますか?
いいえ。
表示されないことがわかっている値で配列を区切るか、サイズを設定する関数へのポインターを渡す必要があります。
ただし、スタック上のデータへのポインターも返しています。それもうまくいきません。
まず、決してローカル変数へのポインターを返さないでください。その配列をヒープに割り当てます。
配列のサイズを返すことに関しては、ポインターと配列サイズの両方を含む構造体を関数に返させることができます。
もう 1 つの方法は、呼び出し先が変更するサイズ変数への参照を呼び出し元に渡すことです。
不明なarray
場合size
は印刷できません
この問題を回避するには、
1>センティナル値、つまり配列の終わりを示す値を提供します。-1
それでは番人であると考えてみましょう
int a[]={1,2,3,4,5,-1};
^
|->-1 would denote the end of array
ただし、値の1つが次のように思われる場合、このソリューションは失敗します-1
また
2>構造体を使用してサイズと配列の内容を示す
struct list
{
int *values;//the array of values
int size;//size of the values array
}
また、ローカルスコープを持つ値へのポインターを返さないでください..つまり、あなたの場合、ローカル値はa
..メソッドから出るとすぐに破棄されます..a
メソッドが返された後のこれへのさらなるアクセスはエラーです
a
はローカル変数であるため、関数外でその値にアクセスすることはできませんtheFunction
。
とにかく、サイズなしで配列を出力するには、区切り文字 (たとえば、特定の値) を追加する必要があります。
配列の長さも出力パラメータとして返すのはどれくらい難しいですか? 配列に終わりを示す特別な番号がある場合は、それを使用できます。そうしないと、ポインターだけで配列の長さを見つける方法がありません。また、関数外でスタックポインタを返すと、クラッシュする可能性があります。