我是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;
}
答案 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)
真的有两件事:
您不能将数组用作左值,而是需要使用指针。 E.g。
int* board = create_board();
然而,更大的问题是,在create_board()
函数中,您将返回指向基于堆栈的数组的指针,该数组将在函数返回后立即销毁。您需要使用malloc
或new
进行分配,或将其设为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;
}