-3

私はC++が初めてで、以下のコードがあります。int board[] = create_board();Javaのように割り当てようとしていますが、エラーが発生します

イニシャライザがボードのサイズを特定できませんでした。

また、そのコード行を削除すると、print ステートメントがコマンド プロンプトに表示されません。

配列の印刷にも間違っていることがありますか?

コード:

#include <iostream>
using namespace std;

int* create_board() {
  int* pointer;
  int board[15];
  pointer=board;
  for(int i=0; i<16; i++)
    board[i] = 1;
  return pointer;
}

int main () {   
  int board[] = create_board(); 
  for (int i; i<16; i++)
      std::cout << board[i];
  return 0;
}
4

3 に答える 3

3

std::vector初心者としては、生のポインターの代わりに実際に使用する必要があると思います。これを使用するプログラムの例を次に示します。

#include <iostream>
#include <vector>

std::vector<int> create_board()
{
   return std::vector<int>(16, 1); // declare 16 integers whose value is 1
}

int main()
{
   std::vector<int> board = create_board();

   for (int i = 0; i < 16; ++i)
       std::cout << board[i];
}

C++11 では、これは次のようになります。

#include <iostream>
#include <array>

int main()
{
    std::array<int, 16> array{};

    array.fill(1);

    for (auto var : array) std::cout << var << '\n';
}
于 2013-03-29T23:45:19.130 に答える
2

本当に間違っている2つのこと:

  1. 配列を左辺値として使用することはできません。代わりに、ポインターを使用する必要があります。例えば

    int* board = create_board();
    
  2. ただし、より大きな問題は、関数内で、create_board()関数が戻るとすぐに破棄されるスタックベースの配列へのポインターを返していることです。mallocまたはを使用してこれを割り当てるか、関数の外部で使用できるポインタを返すためにnew作成する必要があります。static

于 2013-03-29T23:42:19.800 に答える
0

メモリ管理は非常にトリッキーです。手動メモリをいじる前に、それについてもっと読むべきです。今のところ、stl コレクションなどに固執することをお勧めします。

実際の質問に関しては、宣言した配列はスタック上に存在します。つまり、関数が戻るとすぐに消えます。これは、返されたポインターがダングリング ポインターになったことを意味します。つまり、それにアクセスすると、未定義の動作が発生します。

また、1 つのエラーでオフになっています。サイズ 15 の配列を作成しましたが、その 16 要素にアクセスしています。

std::array(本質的には生の配列に対するラッパーのようなタイプ セーフなコレクション) を使用し、ポインターではなく値で返された場合は、次のようになります (ここでは単純にしておきます) 。

通常の配列のようなコレクションの場合は を使用しますstd::vectorが、このような小さな固定サイズの配列の場合は、 をそのまま使用することもできますstd::array。ベクトルは Java のArrayListに相当する C++ であるため、サイズを変更できます。

#include <iostream>
#include <array>

std::array<int, 16> create_board()
{

std::array<int, 16> board;
for(int i=0; i<16; i++)
    board[i] = 1;
return board;
}

int 
main ()
{

std::array<int, 16> board = create_board();

for (int i; i<16; i++)
    std::cout << board[i];
return 0;
}
于 2013-03-29T23:41:42.440 に答える