-3

我是 C++ 新手,我有下面的代码。我正在尝试分配int board[] = create_board();,就像我在 java 中一样,但它给了我错误

初始化程序无法确定板的大小。

此外,当我删除该行代码时,我的打印语句不会显示在命令提示符中。

在打印数组时我做错了什么吗?

代码:

#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

真的有两件事不对:

  1. 您不能将数组用作左值,而是需要使用指针。例如

    int* board = create_board();
    
  2. 然而,更大的问题是,在您的create_board()函数中,您正在返回一个指向基于堆栈的数组的指针,该数组将在您的函数返回后立即被销毁。您需要使用mallocor分配它new,或者让它static返回一个指向它的指针,该指针可以在函数外使用。

于 2013-03-29T23:42:19.800 回答
0

内存管理非常棘手。在尝试弄乱手动记忆之前,您应该阅读更多有关它的信息。我建议现在坚持使用 stl 集合等。

至于实际问题,您声明的数组存在于堆栈中,这意味着它会在函数返回后立即消失。这意味着您返回的指针现在是一个悬空指针,这意味着访问它会产生未定义的行为。

你也有一个错误。您创建了一个大小为 15 的数组,但您正在访问其中的 16 个元素。

如果您使用的是std::array(本质上是类型安全的,像原始数组上的包装器的集合)并通过值而不是指针返回(暂时保持简单),情况可能会如下所示。

对于普通的类似数组的集合,您std::vector可以使用std::array. 向量是 Java 的 C++ 等价物ArrayList,因此它们可以改变大小。

#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 回答