जब मैं संकलन और रन मेरी लिनक्स x86_64 मशीन, जीसीसी द्वारा संकलित पर सी कार्यक्रम निम्नलिखित:जीसीसी द्वारा संग्रहीत स्ट्रिंग स्थिरांक कहां से हैं और जहां से इन पॉइंटर्स मैप किए जाते हैं?
बराबर 0x40064c 0x40064c
मैं:
#include <stdio.h>
int main(void)
{
char *p1 = "hello"; // Pointers to strings
char *p2 = "hello"; // Pointers to strings
if (p1 == p2) { // They are equal
printf("equal %p %p\n", p1, p2); // equal 0x40064c 0x40064c
// This is always the output on my machine
}
else {
printf("NotEqual %p %p\n", p1, p2);
}
}
मैं हमेशा के रूप में आउटपुट प्राप्त समझें कि तार स्थिर तालिका में संग्रहीत हैं लेकिन गतिशील आवंटित स्मृति की तुलना में पता बहुत कम है।
निम्नलिखित कार्यक्रम के साथ तुलना करें:
#include <stdio.h>
int main(void)
{
char p1[] = "hello"; // char arrar
char p2[] = "hello"; // char array
if (p1 == p2) {
printf("equal %p %p\n", p1, p2);
}
else { // Never equal
printf("NotEqual %p %p\n", p1, p2); // NotEqual 0x7fff4b25f720 0x7fff4b25f710
// Different pointers every time
// Pointer values too large
}
}
दो संकेत बराबर नहीं हैं, क्योंकि इन दो सरणियों जो स्वतंत्र रूप से हेरफेर किया जा सकता है।
मैं जानना चाहता हूं कि जीसीसी इन दो कार्यक्रमों के लिए कोड कैसे उत्पन्न करता है और निष्पादन के दौरान उन्हें स्मृति में कैसे मैप किया जाता है। चूंकि यह पहले ही दस्तावेज किया जाएगा, इसलिए कई बार दस्तावेज़ों के किसी भी लिंक का स्वागत है।
आप हमेशा डिस्सेप्लर पर चोटी कर सकते हैं। यह विकसित करने के लिए एक अच्छा कौशल है, आपको भविष्य में इसे फिर से करने की आवश्यकता होगी। –
आपके उदाहरण कोड में केवल दो स्ट्रिंग हैं: 'बराबर% पी% पी \ n' और' NotEqual% p% p \ n'। 'p1' और 'p2' केवल कुछ मानों के लिए प्रारंभ किए गए वर्ण सरणी चर हैं, जिन्हें तब स्ट्रिंग के रूप में उपयोग किया जाता है। विशेष रूप से, आप अभी भी 'पी 1 [0] =' एच 'कर सकते हैं; पी 2 [0] = 'जे'; उदाहरण के लिए, किसी भी मुद्दे के बिना। यदि आप स्ट्रिंग स्थिरांक होने के लिए 'p1' और' p2' चाहते थे, तो 'स्थिर कॉन्स char p1 [] = "हैलो" का उपयोग करें; '। कम से कम जीसीसी-4.6.3 स्थानीय कॉन्स एरे को वैरिएबल के रूप में मानता है, न केवल वास्तविक पढ़ने-योग्य स्थिरांक, इसलिए 'स्थिर' की आवश्यकता होती है। और यह तारों को जोड़ता नहीं है, इसलिए दोनों में अलग-अलग पॉइंटर्स होते हैं। आप किस कंपाइलर का उपयोग कर रहे हैं? –