2012-04-14 25 views
6

से अमान्य रूपांतरण मेरे पास निम्न कोड है;'void *' से 'unsigned char *'

void* buffer = operator new(100); 
unsigned char* etherhead = buffer; 

मुझे संकलन करने का प्रयास करते समय उस पंक्ति के लिए निम्न त्रुटि मिल रही है;

error: invalid conversion from ‘void*’ to ‘unsigned char*’ 

क्यों मुझे लगता है कि त्रुटि मिलती है, मैंने सोचा था कि एक शून्य था "टाइप-कम" तो यह कुछ भी इंगित कर सकते हैं, या कुछ भी यह करने के लिए बात कर सकते हैं?

उत्तर

9

आपको इसे कास्ट किए बिना किसी शून्य * को किसी भी रूप में परिवर्तित नहीं कर सकता है।

आप

unsigned char* etherhead = (unsigned char*)buffer; 

करने के लिए (हालांकि आप एक static_cast भी इस्तेमाल कर सकते हैं)

शून्य संकेत के बारे में अधिक जानने के लिए 6.13 — Void pointers पर एक नज़र डालें की आवश्यकता होगी।

0
void *pt; 

pt=(void*)&i; 
pt=(void*)&dbl; 

यहां मैं यह कैसे करूँगा।

+0

ओह :(मैंने सोचा था कि आप कर सकते हैं, हालांकि मैं बाद में उपयोग के लिए स्मृति में एक्स बाइट आवंटित कर सकता हूं, क्योंकि 10 बाइट चार या 10 बाइट int दोनों 10 बाइट लंबे हैं, आवंटित 10 बाइट्स के मानों के अप्रासंगिक हैं। क्या यह गलत है? – jwbensley

+0

क्या कोई अनिवार्य कारण है कि आप स्मृति का पुन: उपयोग करना चाहते हैं? यदि नहीं, तो ऐसा न करें, यह प्रोग्राम को अनावश्यक रूप से जटिल बनाता है। – Philipp

4

आप किसी भी सूचक को शून्य * में परिवर्तित कर सकते हैं, लेकिन आप बिना किसी कलाकार के शून्य * को परिवर्तित कर सकते हैं। यह कल्पना करने में मदद कर सकता है कि "शून्य" सब कुछ के लिए आधार वर्ग है, और "int" और "char" और "शून्य" के सभी उप-वर्ग क्या नहीं हैं।

1

सी ++ को सी से अधिक प्रकार के सुरक्षित होने के लिए डिज़ाइन किया गया है। यदि यह सी कोड है, तो यह ठीक हो सकता है, लेकिन यह भी निर्भर करता है कि आप अभी किस कंपाइलर का उपयोग कर रहे हैं।

इसके अलावा, तकनीकी रूप से, "extern" सी "int *" और "int *" विभिन्न प्रकार ... (Solaris संकलक की तरह इस बाहर ले जाएगा) कर रहे हैं

मैं का उपयोग कर C++ शैली के बजाय डाली आप सुझाव है सी कास्ट यहां अधिक विवरण हैं:

Regular cast vs. static_cast vs. dynamic_cast

5

एक void* कुछ भी इंगित कर सकता है और आप एक डाली के बिना एक void* को कुछ और करने के लिए एक सूचक परिवर्तित कर सकते हैं लेकिन आप एक static_cast उपयोग करने के लिए रिवर्स क्या करना है।

unsigned char* etherhead = static_cast<unsigned char*>(buffer); 

आप 100 unsigned char की एक गतिशील आवंटित बफर चाहते हैं तो आप यह कर और कलाकारों से परहेज बेहतर कर रहे हैं।

unsigned char* p = new unsigned char[100]; 
3

यहां थोड़ी देर की सोच है: जब भी आपको लगता है कि आपको कास्ट या पॉइंटर्स की आवश्यकता है, तो फिर से सोचें। , new

std::vector<unsigned char> data(size); 

कच्चे संकेत: यदि आप सभी की जरूरत स्मृति के 100 अहस्ताक्षरित बाइट्स की है,

std::array<unsigned char, 100> data; 

या

unsigned char data[100]; 

का उपयोग आकार स्थिर नहीं है, तो एक सदिश का उपयोग ऑपरेटर, और कास्ट असुरक्षित हैं, सही होने के लिए कठिन हैं और आपके प्रोग्राम को समझने में कठोर बनाते हैं। यदि संभव हो तो उनसे बचें।