8

関数から整数の配列を返し、数値を並べ替えてから、すべてをメインに戻そうとしています。このコードでは、メモリの割り当てと解放を行っていません。本当に効果があるのか​​試してみました。コンパイラは、ステートメントのエラーにフラグを立てますb=sort(a)。それは割り当て可能ではないと言っていますが、これは理にかなっています。入力整数はポインターではありません。整数の配列をポインタとして宣言する方法はありますか? そのような :

int *a[5]={3,4}

#include <stdio.h>
#include <stdlib.h>
int *sort(int *input_array);

int *sort(int *input_array)
{
    return input_array;
}

int main()
{
    int a[5]={3,4};
    int b[5];
    b=sort(a);
    return 0;
}
4

4 に答える 4

12

配列を作成する場合、配列自体に割り当てることはできません (要素にのみ)。また、配列を渡すときは参照渡しなのでsort()、配列を変更して返す必要がなくなります。

あなたが探しているのは、次のいずれかです: 元の配列を並べ替えると、次のようになります。

void sort (int * array);

void sort (int * array) {
  // do stuff on the array
}

int main (void) {
  int a[5] = {1, 46, 52, -2, 33};
  sort(a); // result is still in a
  return 0;
}

または、コピーを作成して並べ替えると、次のようになります。

#include <stdlib.h>
#include <string.h>
int * sort (int * array, unsigned size);

int * sort (int * array, unsigned size) {
  int * copy = malloc(sizeof(int) * size);
  memcpy(copy, array, size * sizeof(int));
  // sort it somehow
  return copy;
}

int main (void) {
  int a[5] = {1, 46, 52, -2, 33};
  int * b; // pointer because I need to assign to the pointer itself
  b = sort(a, (sizeof a) / (sizeof *a)); // now result is in b, a is unchanged
  // do something with b
  free(b); // you have to
  return 0;
}
于 2013-05-17T08:32:03.967 に答える
5

配列を割り当てることはできません。それらは「第一級市民」ではなく、ポインターのように動作します。

次のようなものが必要です:

int a[] = { 3, 4 };
int *b;

b = sort(a, sizeof a / sizeof *a);

配列のsizeof長さを計算するために式が必要です。sort()関数は、渡された裸のポインターからそれを判断できません。

UPDATE:上記は、入力配列を変更しないことを前提としていますが、そうする場合(コメントで指摘されているように、ありがとう)、呼び出しが返さaれたときに呼び出し元が変更されるため、戻り値はもちろん必要ありませんsort()

于 2013-05-17T08:29:12.390 に答える
1

配列 - のポインタを渡す場合int、変更された配列を返す必要はありません。渡した配列が変更されます。

@unwind が提案したように、配列内にいくつの要素があるかを関数が認識できるように、要素の数も関数に渡す必要があります。

于 2013-05-17T08:29:52.093 に答える
1

C では配列を返すことはできません。単一のデータ型の単一のインスタンスのみを返すことができます。

そのデータ型は、数値の連続したリスト(またはその他のもの)を格納するメモリへのポインターにすることができますが、結果の長さに関するすべての情報を失うため、それを知る必要があるか、出力として別の値を持たなければなりません長さを示す変数。

データのリストと長さの両方を含む構造体などのカスタム データ型を返すこともできます。ただし、大きなデータ構造を返すと、データ構造の複数の浅いコピーが作成され、プログラムの実行が遅くなるだけでなく、リークや複数の参照によるメモリの悪夢が発生します。

ただし、カスタム データ構造へのポインターを返すことは非常にうまく機能します。

于 2013-05-17T08:32:38.827 に答える