2011-06-23 11 views
24

मेरे पास ptr नामक एक शून्य सूचक है। मैं इस मूल्य को कई बाइट्स से बढ़ाना चाहता हूं। क्या इसे करने का कोई तरीका है?एक बाइट द्वारा वृद्धि शून्य सूचक? दो से?

कृपया ध्यान दें कि मैं इसे और अधिक चर बनाने के बिना इस जगह में करना चाहता हूं।

क्या मैं ptr = (void *)(++((char *) ptr)); जैसे कुछ कर सकता हूं?

उत्तर

48

आप शून्य सूचक पर अंकगणित नहीं कर सकते हैं क्योंकि पॉइंटर अंकगणित को ऑब्जेक्ट के आकार के संदर्भ में परिभाषित किया जाता है।

आप कर सकते हैं, हालांकि, एक char* सूचक डाली, कि सूचक पर गणित करते हैं, और फिर इसे एक void* वापस करने के लिए परिवर्तित:

void* p = /* get a pointer somehow */; 

// In C++: 
p = static_cast<char*>(p) + 1; 

// In C: 
p = (char*)p + 1; 
+1

क्या यह reinterpret_cast नहीं होना चाहिए? – Balk

+4

@ बाल्क: 'static_cast' पर्याप्त है। –

15

कोई अंकगणितीय संचालन void सूचक पर नहीं किया जा सकता है।

कंपाइलर void पॉइंटर के आइटम (ओं) के आकार को नहीं जानता है। ऐसा करने के लिए आप पॉइंटर को (char *) पर डाल सकते हैं।

जीसीसी में एक एक्सटेंशन है जो void के आकार को 1 के रूप में मानता है। इसलिए कोई बाइट्स में ऑफसेट जोड़ने के लिए void* पर arithematic का उपयोग कर सकता है, लेकिन इसका उपयोग गैर-पोर्टेबल कोड उत्पन्न करेगा।

+0

जीसीसी में यह संभव है क्योंकि 'sizeof (शून्य)' पैदावार '1'। –

+0

@ ब्लागोवेस्ट Buyukliev: यह जीसीसी में विस्तार है जो 1 के रूप में एक शून्य के आकार का इलाज करता है, इसका उपयोग गैर पोर्टेबल कोड पैदा करेगा। –

+1

@ ब्लाग: हमेशा की तरह, कृपया '-pedantic' के साथ संकलित करें। :) – Xeo

4

बस void* incrementing जीसीसी में काम करने के लिए होता है:

#include <stdlib.h> 
#include <stdio.h> 

int main() { 
    int i[] = { 23, 42 }; 
    void* a = &i; 
    void* b = a + 4; 
    printf("%i\n", *((int*)b)); 
    return 0; 
} 

यह अवधारणात्मक रूप से (और आधिकारिक तौर पर) गलत है, इसलिए आप इसे स्पष्ट करना चाहते हैं: इसे char* पर और फिर वापस डालें।

void* a = get_me_a_pointer(); 
void* b = (void*)((char*)a + some_number); 

इससे यह स्पष्ट हो जाता है कि आप कई बाइट्स से बढ़ रहे हैं।

+1

हमेशा की तरह, कृपया '-pedantic' के साथ संकलित करें। :) यह जीसीसी द्वारा एक गैर-अनुरूप विस्तार है। – Xeo

+0

मान लीजिए कि मैं खराब हूं :) - शुद्धता के लिए उत्तर संपादित किया – tdammers

-1

आप कर सकते हैं:

++(*((char **)(&ptr))); 
+4

हाँ, लेकिन क्यों _would_ आप? यह भयानक अस्पष्ट कोड है जो किसी भी अच्छे कारण के लिए, जो कुछ भी कर रहा है उसे पार्स करना मुश्किल हो जाता है। इसके अलावा, सी -+ में सी-स्टाइल कास्ट निराश होना है, लेकिन यहां कम से कम समस्याएं हैं। –

+2

आप अपनी आंखों में एक ज्वलंत छड़ी भी डाल सकते हैं। यह शायद '++ (* ((char **) (& ptr)) को देखने से कम चोट पहुंचाएगा);'। –

संबंधित मुद्दे