2016-03-07 119 views
0

我在C++初學者的數組,並試圖通過for循環將數據插入到一個數組,但是,它拋出Stack around the variable 'numArray' was corrupted.C++插入通過for循環

我的代碼:

//Initializing and declairing variables 
int numVal = 0; 
int numArray[] = {0}; 

cout << "Enter the number of values to average: "; 
cin >> numVal; 

//Loop through to accept all values and allocate them to an array 
for (int i = 0; i < numVal; i++) { 
    cout << "[" << i << "] = "; 
    cin >> numArray[i]; 
} 

什麼我的代碼錯了?

編輯:我必須使用數組而不是向量。

+0

是否有任何理由你不使用'std :: vector'或類似的容器? –

+0

你認爲在初始化之後數組會有多少元素? – jpw

+0

練習指示我使用數組而不使用矢量,初始化時我們不知道大小 – Shepard

回答

3
int numArray[] = {0} 

在此行中,您可以指定numArray可以容納一個整數。稍後,當您嘗試輸入任何多個整數時,您會得到undefined behavior。把這看成是一個承諾。這條線是你有希望的「給我一個內存位置,我保證我不會讀或寫任何超過第一個地址的地址。」當你違反這個承諾時,任何理論上都可能發生。

爲了解決這個問題,你需要爲這個數組分配更多的內存,並檢查以確保你永遠不會定義超過這個數字的東西。或者,更簡單,更方便的方法是使用一個可以自動爲你做的數組,例如vector

如果您確實必須使用數組,請確保在輸入多個元素時有一些跟蹤方法。例如:

const int SIZE = 10; 
int numArray[SIZE]; 

... 

std::cout << "Enter the number of values to average (less than " << SIZE << ")" << std::endl; 
std::cin >> numVal; 
if (numVal >= SIZE) 
{ 
    std::cout << "Please enter a number smaller than " << SIZE << std::endl; 
} 
+0

有雅,有道理,謝謝。這是我的問題的正確答案。 – Shepard

+1

+1,但應該注意的是該數組未初始化。使用'memset'或'int numArray [SIZE] = {0}'初始化爲全0,否則數組的內容可能是隨機的。 – LINEMAN78

0

int numArray[] = {0};意味着製作一個大小爲1的數組。 C樣式數組必須在聲明中指定其大小(明確地說,或者從初始值的數目中推導出來,就像你已經完成的那樣)。

它們不能在以後生長或調整大小。當您執行cin >> numArray[1]時,您會寫出數組的邊界,導致堆棧損壞。

如果您想要一個可調整大小的數組,然後在C++中調用vector。您的代碼是:

vector<int> numArray; 

// ... in loop 
int temp = 0; 
cin >> temp; 
numArray.push_back(temp); 
-1

您正在編寫C++,而不是C;使用C++容器類。

std::vector<int> numArray; 
int numVal = 0; 

cin >> numVal; 

numArray.resize(numVal); // add numVal entries to the vector 

for (int i = 0; i < numArray.size(); ++) 
{ 
    cout << "[" << i << "]" = "; 
    cin >> numArray[i]; 
} 
1

假設你想要使用數組動態盡一切:

#include <iostream> 
using namespace std; 

int main() { 
    //Initializing and declairing variables                      
    int numVal = 0; 
    int *numArray; 

    cout << "Enter the number of values to average: "; 
    cin >> numVal; 

    numArray = new int[numVal]; 

    //Loop through to accept all values and allocate them to an array                
    for (int i = 0; i < numVal; i++) { 
    cout << "[" << i << "] = "; 
    cin >> numArray[i]; 
    } 

    delete[] numArray; 

    return 0; 
} 

總是通過調用刪除記得自由堆內存。爲了達到最佳效果,請始終使用valgrind來測試您的程序。