C ++赋值错误

时间:2013-03-29 23:38:57

标签: c++

我是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;
}

3 个答案:

答案 0 :(得分: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';
}

答案 1 :(得分:2)

真的有两件事:

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

    int* board = create_board();
    
  2. 然而,更大的问题是,在create_board()函数中,您将返回指向基于堆栈的数组的指针,该数组将在函数返回后立即销毁。您需要使用mallocnew进行分配,或将其设为static,以便返回可在函数外部使用的指针。

答案 2 :(得分:0)

内存管理非常棘手。在尝试弄乱手动内存之前,您应该阅读更多相关内容。我建议暂时坚持使用stl集合等。

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

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

如果您使用std::array(本质上是类型安全,像原始数组上的包装器一样的集合)并且通过值而不是指针返回(现在保持简单),这就是事情的样子。

对于普通的arraylike集合,您使用的是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;
}