मैंने इस कोड को प्रोजेक्ट में देखा।एक ही पंक्ति में दो बार कास्टिंग
void *b = ...;
int a = (int) (unsigned long) b;
इस लाइन व्यर्थ है:
b
के प्रकार void*
है? मेरा मतलब है, यह सभी मामलों में a = (int) b
जैसा ही है?
मैंने इस कोड को प्रोजेक्ट में देखा।एक ही पंक्ति में दो बार कास्टिंग
void *b = ...;
int a = (int) (unsigned long) b;
इस लाइन व्यर्थ है:
b
के प्रकार void*
है? मेरा मतलब है, यह सभी मामलों में a = (int) b
जैसा ही है?
यह शायद 64-बिट यूनिक्स सिस्टम पर एक संकलक चेतावनी जहां unsigned long
एक 64-बिट मात्रा और इसलिए काफी बड़ा एक सूचक धारण करने के लिए है से बचा जाता है, लेकिन int
एक 32-बिट मात्रा कि काफी बड़ा एक सूचक धारण करने के लिए नहीं है । (unsigned long)
पर कास्ट पते के सभी बिट्स को संरक्षित करता है; बाद में कास्ट int
पते के उच्च-आदेश 32-बिट को फेंकता है, लेकिन डिफ़ॉल्ट रूप से चेतावनी के बिना ऐसा करता है।
प्रदर्शित करने के लिए:
int main(void)
{
void *b = (void *)0x12345678;
int a = (int)(unsigned long)b;
int c = (int)b;
return a + c;
}
$ gcc -O3 -g -std=c99 -Wall -Wextra -c ar.c
ar.c: In function ‘main’:
ar.c:5:15: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
$
पर मैक ओएस एक्स 10.8.4 जीसीसी 4.7.1 का उपयोग करना, 64-बिट संकलन करने के लिए दोषी।
अनुमान लगाया जाना दिलचस्प है कि 'पते के हिस्से' के साथ क्या किया जाएगा।
मैं इसे अपने प्रोजेक्ट में भी देखता हूं।
मेरे मामले में, 'बी' की सामग्री अंतर-प्रक्रिया संचार के लिए उपयोग किए जाने वाले अन्य स्रोत/मिडलवेयर द्वारा पॉप्युलेट की जाती है।
एक बार 'बी' पॉप्युलेट हो जाने पर, कार्यक्रम को 'बी' की सामग्री को सही क्षेत्र 'ए' में कास्ट के साथ प्राप्त किया जाएगा। आवेदन तब प्रसंस्करण के लिए 'ए' का उपयोग करता है।
मेरी परियोजना शून्य * के बजाय char * का उपयोग करती है।
सीधे टाइप करने के लिए पॉइंटर को छोटे प्रकार से टाइप करना int का परिणाम x64 बिट वातावरण के तहत कुछ कंपाइलर (जैसे क्लैंग) पर संकलन त्रुटि हो सकता है।
उदाहरण के लिए:
void *p = GetSomeAddress;
int i = (int)p; //error on compilers like Clang.
समाधान है:
int i = (int)(unsigned long)p;
या
int i = (int)(long)p;
इसका कारण यह है यूनिक्स पर, LP64 मॉडल के तहत, लंबे समय से 64-बिट है।
ऐसे मामलों में, आपको अच्छी तरह से देखना होगा कि आपको पॉइंटर से int या अन्य छोटे प्रकार के टाइपकास्ट की आवश्यकता क्यों होती है जिसके परिणामस्वरूप डेटा का नुकसान हो सकता है।
यह प्रश्न आपकी मदद भी कर सकता है। How should I handle "cast from ‘void*’ to ‘int’ loses precision" when compiling 32-bit code on 64-bit machine?
आपको दिमाग, क्रिएटिव लोग 'शून्य *' में संख्यात्मक (या बूलियन) जानकारी छिपाते हैं :) – hroptatyr
क्या यह मुझे रचनात्मक बनाता है - उदाहरण कोड के साथ जो मैं लिख रहा था, जबकि मैं लिख रहा था? –
हेहे, वास्तव में ऐसा करता है, इसलिए +1 :) एक गंभीर नोट पर, बहुत से एपीआई 'शून्य *' का उपयोग करते हैं, जहां 'intptr_t' उपयुक्त – hroptatyr