दिलचस्प पोस्ट
एक-आयामी सरणी में बहुआयामी सरणी को चालू करना App.config / web.config के भीतर चर Django ImageField पर प्रोग्राम की बचत करना एमपी 3 अवधि पाने के लिए PHP फ़ंक्शन दूरस्थ मॉडल के साथ बूटस्ट्रैप 3 Android में स्पंज कैसल जेएआर को कैसे शामिल किया जाए? जावा में printf आउटपुट संरेखित करें कन्वर्ट दिनांकटाइम को जूलियन दिनांक में सी # (सुरक्षित करने के लिए?) मैं एक एक्सप्रेस आवेदन में JSON POST डेटा का उपयोग कैसे करूँ? टेस्टिंग टेक्स्ट () XPath में नोड्स बनाम स्ट्रिंग मान निर्धारित अनुभाग हेडर के साथ UITableView वसंत MVC परीक्षण के साथ "परिपत्र व्यू पथ" अपवाद से कैसे बचें? मैं जावा में एक लिंक्ड सूची डेटा संरचना कैसे बनाऊं? टेक्सटेरिया में वर्णों की गणना करें अद्यतन पैनल रिफ्रेश के बाद मैं कुछ जावास्क्रिप्ट कैसे चला सकता हूं?

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

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

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

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

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

वेब के समाधान से एकत्रित समाधान "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 वापसी कभी नहीं डाली

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

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