2

そのため、関数内に int の配列を割り当てる必要があります。配列は関数を呼び出す前に宣言され (関数の外部でその配列を使用する必要があります)、サイズは関数内で決定されます。出来ますか ?私は多くのことを試してきましたが、これまでのところ何もうまくいきませんでした。

助けてくれてありがとう!ここにいくつかのコードがあります:

void fillArray(int *array)
{
  int size = ...//calculate size here
  allocate(array, size);
  //....
}

void alloc(int * &p, int size)
{
  p = new int[size];
}

int main()
{
  //do stuff here
  int *array = NULL;
  fillArray(array);
  // do stuff with the filled array
 }
4

1 に答える 1

14

私が正しく理解していれば、関数を呼び出す前に配列を宣言していません。配列ではなくintへのポインタを宣言したようです。それ以外の場合、実際に配列を宣言した場合、そのサイズを変更して関数にメモリを割り当てることはできません。

このタスクを実行するには、少なくとも 3 つのアプローチがあります。最初のものは次のようになります

int *f()
{
    size_t n = 10;

    int *p = new int[n];

    return p;
}

そして、関数nは次のように呼び出されます

int *p = f();

もう 1 つの方法は、int へのポインターへのポインターの型を持つ関数のパラメーターを宣言することです。例えば

void f( int **p )
{
    size_t n = 10;

    *p = new int[n];
}

関数は次のように呼び出すことができます

int *p = nullptr;

f( &p );

3 番目のアプローチは、ポインターへの参照を関数パラメーターとして使用することです。例えば

void f( int * &p )
{
    size_t n = 10;

    p = new int[n];
}

関数は次のように呼び出されます

int *p = nullptr;

f( p );

std::vector<int>より良い方法は、ポインターの代わりに標準クラスを使用することです。例えば

void f( std::vector<int> &v )
{
   size_t n = 10;

   v.resize( n );
}

関数は次のように呼び出すことができます

std::vector<int> v;

f( v );

また、次のようなスマートポインターを使用することもできますstd::unique_ptr

于 2014-11-13T08:20:28.517 に答える