2013-03-29 73 views
-2

我是C++的新手,我擁有下面的代碼。我想分配int board[] = create_board();,就像我在java中那樣,但它給了我錯誤C++分配錯誤

初始化器無法確定板的大小。

此外,當我刪除該行代碼時,我的打印語句不顯示在命令提示符中,無論如何。

有沒有什麼,我在做錯誤的陣列打印呢?

代碼:

#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

內存管理是非常棘手的。在嘗試混淆手動內存之前,應該先閱讀更多內容。我建議現在堅持使用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; 
} 
2

兩個錯誤真的:

  1. 不能使用數組作爲左值,而不是你需要使用一個指針。例如。

    int* board = create_board(); 
    
  2. 更大的問題,然而,就是在你create_board()功能你是返回一個指針,將盡快銷燬你的函數返回一個基於堆棧的數組。您需要使用mallocnew或使其成爲static來分配,以便返回可用於該函數之外的指針。

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'; 
}