2012-08-03 21 views
6

मैं सी ++ विशेष रूप से एसटीएल के लिए बिल्कुल नया हूं। मैं एक वेक्टर को एक समारोह के लिए तर्क के रूप में पारित करने की कोशिश कर रहा हूं, लेकिन यह एप्लिकेशन को क्रैश करने का कारण बनता है। मैं कोड :: ब्लॉक और मिंगडब्ल्यू का उपयोग कर रहा हूं। यहां एक साधारण कोड है।एक वेक्टर को तर्क के रूप में पास करना और इसका उपयोग करना, यह क्यों दुर्घटनाग्रस्त हो जाता है?

#include <iostream> 
#include <vector> 

using namespace std; 

void foo(const vector<int> &v) 
{ 
    cout << v[0]; 
} 
int main(){ 
    vector<int> v; 
    v[0] = 25; 
    foo(v); 
return 0; 
} 

धन्यवाद!

उत्तर

6

यह क्रैश हो जाता है क्योंकि आप v[0] के साथ वेक्टर के अंत में लिखते हैं - यह अपरिभाषित व्यवहार है। यदि आप कुछ भी नहीं करते हैं तो इसका प्रारंभिक आकार 0 है। (आप बाद में भी वही पढ़ते हैं, लेकिन उस बिंदु से पहले सभी दांव अच्छी तरह से बंद हैं)। आप [] ऑपरेटर आप अपवाद नहीं बल्कि अपरिभाषित व्यवहार से फेंक दिया हो जाएगा के बजाय v.at(n) का उपयोग करते हैं

vector<int> v(1); 
v.at(0) = 25; 
foo(v); 

:

आप शायद करना चाहता था:

vector<int> v; 
v.push_back(25); 
foo(v); 

या हो सकता है।

+0

धन्यवाद! मुझे एसटीएल के बारे में और जानना चाहिए। मैं एक वेक्टर को एक साधारण सरणी के रूप में मानता हूं जो स्पष्ट रूप से गलत है! – Physer

+0

@ फीसर - एक वेक्टर बहुत सारे तरीकों से एक सरणी के समान है। वेक्टर के अंत से पहले पढ़ना एक सरणी के अंत से पहले पढ़ने से बेहतर/खराब नहीं है। – Flexo

+0

मुझे लगता है कि आपका क्या मतलब है। यह एक बड़े कोड का एक अंश है जिस पर मैं काम कर रहा हूं। शुरुआत में मैंने वेक्टर को एक आकार v (100) दिया था और इसे लूप का उपयोग करके पॉप्युलेट किया था, जैसे v [i] = value; ... – Physer

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^