तो मुझे कुछ सी कोड मिला है:वैश्विक चर के साथ स्ट्रैपी एक सेगमेंटेशन गलती क्यों ट्रिगर करता है?
#include <stdio.h>
#include <string.h>
/* putting one of the "char*"s here causes a segfault */
void main() {
char* path = "/temp";
char* temp;
strcpy(temp, path);
}
यह दिखता है, चलाता है और व्यवहार करता है जैसा दिखता है। हालांकि, यदि एक या दोनों चरित्र पॉइंटर्स को ग्लोबल वैरिएबल के रूप में घोषित किया गया है, तो खंडन गलती में स्ट्रैपी परिणाम। क्यों होता है ऐसा? स्पष्ट रूप से गुंजाइश की मेरी समझ में एक त्रुटि है।
चूंकि मुझे नहीं लगता कि यह वास्तव में समस्या को हल करने जा रहा है, मैं बस टिप्पणी करूंगा कि strnpy पर अत्यधिक strncpy की अनुशंसा की जाती है। –
जोश गगनन: दरअसल, इनपुट स्ट्रिंग की लंबाई> = बफर होने पर strncpy शून्य टर्मिनेटर नहीं रखता है। अगर आप जानते हैं कि बफर काफी बड़ा है तो स्ट्रैपी पूरी तरह से सुरक्षित है। अन्यथा, 'snprintf (buffer, buffer_len, "% s", src) का उपयोग करें, क्योंकि, snprintf हमेशा एक शून्य टर्मिनेटर रखता है (बस सुनिश्चित करें कि buffer_len> 0)। –
@ जोश: मैं 'strlcpy' पसंद करते हैं। दुर्भाग्य से ग्लिबैक इसका समर्थन नहीं करता है इसलिए मुझे इसका उपयोग करने का अधिक मौका नहीं मिलता है। मुझे लगता है कि मैं हमेशा अपना खुद का कार्यान्वयन कर सकता हूं और इसे अपनी व्यक्तिगत हेडर लाइब्रेरी में नल-चेकिंग मॉलोक और फ़ाइल से संबंधित कार्यों में जोड़ सकता हूं, लेकिन यह अभी भी मुझे परेशान करता है कि यूनिक्स के कई संस्करणों में यह है कि लिनक्स आमतौर पर नहीं करता है। – JAB