समस्या इस लाइन है:
scanf("%d\n", age);
scanf सूचक तर्क की उम्मीद है - यह एक ही तरीका है की कार्य यह एक ठीक करने के लिए में सी में पैरामीटर संशोधित कर सकते हैं है, तो आप की जरूरत है:
scanf("%d\n", &age);
जो उम्र के पते को पास करता है, जो अब एक सूचक है (एक सूचक एक चर है जिसमें स्मृति के दूसरे क्षेत्र में एक पता होता है)।
इस के लिए के रूप में:
char* name = "";
आउच-ow-कृपया-नहीं है! ठीक है, मुझे समझाने की जरूरत है। आपने एक चरित्र प्रकार के लिए एक सूचक के लिए कहा है, लेकिन जहां तक सभी का संबंध है, आपको बस एक चरित्र है, पूरी स्ट्रिंग नहीं। यह सही है, पर्याप्त जगह नहीं है। सी आपको ऐसा क्यों करने देता है? खैर, सी मूल रूप से पोर्टेबल असेंबलर है, इसलिए आप स्मृति में जहां भी चाहें लिख सकते हैं (या बल्कि, आप कोशिश कर सकते हैं और कंपाइलर असहमत नहीं होगा, लेकिन ऑपरेटिंग सिस्टम संभवतः कर सकता है)।
आपको कुछ जगह आवंटित करने के लिए malloc
का उपयोग करके स्मृति आवंटन पर पढ़ने की आवश्यकता है, अन्यथा मैं एक विशाल स्ट्रिंग इनपुट कर सकता हूं और इसे नाम के पते पर रखा जाता है।
यह किसी भी तरह से, ढेर-आधारित भेद्यता का कारण बन सकता है। क्या, ढेर? हां। एक ढेर एक फिलो संरचना है और हर बार जब आप कोई फ़ंक्शन कॉल करते हैं, तो आप अपने रिटर्न पते और फ़ंक्शन तर्कों के साथ-साथ अक्सर फ़ंक्शन-स्कोप चर के लिए स्टैक पर स्थान जोड़ते हैं।
यह समस्या बन जाती है यदि आप इनपुट आकार की जांच नहीं करते हैं। फिर, मैं निष्पादन योग्य कोड सहित आपके ढेर में भारी मूल्य लिख सकता हूं ... Buffer Overflow देखें।
तो मैं इसे कैसे कम कर सकता हूं, मैंने सुना है, बस सॉफ़्टवेयर भेद्यता को लागू नहीं करने की इच्छा है? आप उन फ़ंक्शंस का उपयोग करते हैं जो आपको अपने बफर इनपुट आकार को निर्दिष्ट करने और विशिष्ट आकार के बफर में पढ़ने की अनुमति देते हैं, और वहां से जाते हैं। बस। यह सरल है।
यह प्रश्न देखें: string reading in C।
स्रोत
2011-01-20 19:25:40