दिलचस्प पोस्ट
अनुसूचित कार्य के रूप में माइक्रोसॉफ्ट एक्सेस चलाना sql त्रुटि "ORA-01722: अमान्य संख्या" WPF और इकाई फ़्रेमवर्क के साथ डेटाएनेटेशन का उपयोग कर डेटा सत्यापित करें? iTextSharp एक पाद लेख पृष्ठ # के # आईफोन ऐप क्रैश रिपोर्ट को प्रतीक बनाते हुए कैसे पता लगाया जा सकता है कि जब उपयोगकर्ता ने एक फ़ाइल को PHP में डाउनलोड करना सफलतापूर्वक पूरा कर लिया है जबकि (1) बनाम। के लिए (;;) क्या कोई गति अंतर है? क्या कोई कारण है कि हम रूबी में "रिवर्स रेंज" पर फिर से नहीं चल सकते? जांचें कि HTML तत्व में स्क्रॉलबार हैं या नहीं क्यों mime_content_type () PHP में पदावनत है? एकाधिक पत्रक को। पीडीएफ में सहेजें बदलें: जावास्क्रिप्ट के साथ सीएसएस गुणों को घुमाएं क्या उद्देश्य-सी में दृढ़ता से टाइप किए गए संग्रह हैं? कैमा ऑपरेटर कैसे काम करता है टीडीर के साथ कई स्तंभों का प्रसार

64-बिट आर्किटेक्चर पर यह कोड segfault क्यों करता है लेकिन 32-बिट पर ठीक काम करता है?

मैं निम्नलिखित सी पहेली पर आया था:

प्रश्न: आईए -64 पर निम्नलिखित प्रोग्राम को सीगफ्ल्ट क्यों नहीं किया जाता है, लेकिन आईए -32 पर काम ठीक है?

int main() { int* p; p = (int*)malloc(sizeof(int)); *p = 10; return 0; } 

मुझे पता है कि 64 बिट मशीन पर int का आकार एक पॉइंटर के आकार के समान नहीं हो सकता ( int 32 बिट हो सकता है और पॉइंटर 64 बिट हो सकता है)। लेकिन मुझे यकीन नहीं है कि यह ऊपर के कार्यक्रम से कैसे संबंधित है। कोई विचार?

Solutions Collecting From Web of "64-बिट आर्किटेक्चर पर यह कोड segfault क्यों करता है लेकिन 32-बिट पर ठीक काम करता है?"

एट के लिए डाली int* मास्क तथ्य यह है कि उचित बिना #include वापसी के प्रकार malloc को int माना जाता है IA-64 का sizeof(int) < sizeof(int*) जो इस समस्या को स्पष्ट करता है।

(यह भी ध्यान रखें कि अपरिभाषित व्यवहार की वजह से यह एक मंच पर भी विफल हो सकता है जहां sizeof(int)==sizeof(int*) सही रखता है, उदाहरण के लिए अगर कॉलिंग सम्मेलन पूर्णांक की तुलना में पॉइंटर्स लौटने के लिए अलग-अलग रजिस्टर करते थे)

Comp.lang.c अक्सर पूछे जाने वाले प्रश्न की एक प्रविष्टि है जिस पर चर्चा की जा रही है कि क्यों malloc से लौटने की आवश्यकता नहीं है और संभावित रूप से खराब है ।

सबसे अधिक संभावना है क्योंकि आप malloc लिए हैडर फ़ाइल को शामिल नहीं कर रहे हैं, और जब संकलक आमतौर पर आपको इसकी चेतावनी देगा, तो यह तथ्य कि आप स्पष्ट रूप से रिटर्न वेल्यू कास्टिंग कर रहे हैं, इसका मतलब है कि आप यह कह रहे हैं कि आप जानते हैं कि आप क्या कर रहे हैं

इसका अर्थ है कि कंपाइलर को उम्मीद है कि एक int को malloc से लौटा दिया जाएगा जो इसे फिर एक सूचक में डालेगा यदि वे अलग-अलग आकार होते हैं, तो यह आपके लिए दुःख का कारण होगा

यही कारण है कि आपने malloc पर malloc रिटर्न नहीं डाला है। यह void* जो इसे वापस देता है, उसे सही प्रकार के सूचक के रूप में परिवर्तित कर दिया जाएगा (जब तक कि आपने उस शीर्षलेख को शामिल नहीं किया है, जिस स्थिति में संभवत: आपको संभावित रूप से चेतावनी दी हो। असुरक्षित अंतर-टू-पॉइंटर रूपांतरण)।

यही कारण है कि आप प्रोटोटाइप के बारे में चेतावनी के बिना कभी संकलन नहीं करते।

यही कारण है कि आप सी में malloc वापसी कभी नहीं डाली

सी ++ संगतता के लिए कलाकारों की आवश्यकता है थोड़ा कारण है (पढ़ें: यहाँ कोई कारण नहीं है) इसे छोड़ने के लिए

सी ++ संगतता हमेशा आवश्यक नहीं है, और कुछ मामलों में संभव नहीं है, लेकिन ज्यादातर मामलों में यह बहुत आसानी से हासिल किया जाता है।