2012-10-08 10 views
5

मैं पहले से ही stackoverflow पर यहाँ कुछ सवाल देखा है, लेकिन उनमें से कोई भी मेरी समस्या हल हो गया है ...रन-टाइम जांच विफलता # 2 - चर के आसपास स्टैक दूषित

मैं सी में है कि कोड है:

variabl आसपास स्टैक -

रन-टाइम जांच विफलता # 2:


#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char str[] = ""; 
    scanf("%[^\n]", str); 
    printf("Você digitou: %s\n", str); 
    system("pause"); 
} 

जब मैं कार्यक्रम चलाने के लिए, मैं त्रुटि थी ई 'स्ट्र' दूषित हो गया था।

अब, मैं सच में मैं गलत वहाँ क्या कर रही हूं पता नहीं ... :(

उत्तर

5

सरणी str केवल कॉल कर सकते हैं एक भी char अपने initialisation दिया। scanf() ढेर भ्रष्ट अपरिभाषित व्यवहार के कारण सीमा str अधिलेखित हो जाएगा करने के लिए, इस मामले में। आप तय करने के लिए कैसे बड़े str सरणी होना चाहिए की जरूरत है और बफर ओवररू को रोकने के लिए पढ़ने वाले वर्णों की संख्या सीमित करें एन।

उपयोग करने के लिए scanf() आपके द्वारा निर्दिष्ट वर्णों की अधिकतम संख्या को पढ़ने के लिए:

char str[1024]; 
if (1 == scanf("%1023[^\n]", str)) /* Check return value to ensure */ 
{         /* 'str' populated.    */ 
}         /* Specify one less than 'str' */ 
            /* size to leave space for null.*/ 

तुम भी fgets() इस्तेमाल कर सकते हैं, लेकिन बाद में नई लाइन चरित्र को दूर करने की आवश्यकता होगी।

2

आप उपयोगकर्ता इनपुट के साथ एक निरंतर ऊपर लिख नहीं करना चाहिए। char * str = malloc(<enough bytes for any possible input) साथ char str[] = "" बदलें या यहाँ तक कि सुरक्षित API के बारे में सीखते हैं।

1

आप केवल इनपुट स्टोर करने के लिए एक बाइट आवंटित कर रहे हैं। लाइन

char str[] = ""; 

स्ट्रिंग सामग्री के लिए शून्य बाइट आवंटित करता है और इसके शून्य टर्मिनेटर के लिए एक बाइट आवंटित करता है। इसके बजाय,

char str[100]; 

या जो भी अधिकतम इनपुट लंबाई होगी, कुछ करें।

0

यह उत्तर जावा/सी # या कुछ अन्य आधुनिक ऑब्जेक्ट ओरिएंटेड भाषा से सी ++ में आने वाले सभी लोगों के लिए है।

मेरे लिए इस मुद्दे को निम्न कारणों से हुआ:

मैं अपने स्वयं के कस्टम सी ++ वर्ग बनाया।

MyClass.h

class MyClass { 

public: 
    void work(); 

}; 

MyClass.cpp

#include "MyClass.h" 
#include <iostream> 

class MyClass{ 
    int64 propA, propB; 

    public: 
     void work(); 

}; 

void MyClass::work() { 
    // some work that uses propA and propB 
} 

मेरे अंतर्ज्ञान था कि propA और propB बस निजी संपत्तियों, इस वर्ग के बाहर कोड से अदृश्य हो जाएगा।

समस्या यह साबित हुई कि मैंने propA और propBMyClass.h में नहीं रखा है। कंपाइलर यह नहीं जानता कि MyClass कॉलर्स द्वारा तत्काल प्राप्त होने पर कितनी मेमोरी आवंटित की जानी चाहिए।

MyClass.h (फिक्स्ड)

class MyClass { 
    int64 propA, propB; 

public: 
    void work(); 

}; 
:

मैं बस हैडर MyClass.h के गुण जोड़ा

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