2013-02-21 67 views
6

जब मैं इस उदाहरण में चार सरणी सब्स्क्रिप्ट का उपयोग करें:चार सरणी सबस्क्रिप्ट चेतावनी

int main(){ 
    char pos=0; 
    int array[100]={}; 

    for(pos=0;pos<100;pos++) 
     printf("%i\n", array[pos]); 

    return 0; 
} 

मैं चेतावनी देता है कि मैं चार सरणी सबस्क्रिप्ट उपयोग कर रहा हूँ हो रही है:

चेतावनी: सरणी सबस्क्रिप्ट टाइप है ' char '[-Wchar-subscripts]

जो ठीक है, क्योंकि मेरे पास यह चेतावनी सक्षम है।

जीसीसी मैनुअल का कहना है: यदि एक सरणी सबस्क्रिप्ट टाइप "चार" है

-Wchar-सबस्क्रिप्ट चेतावनी । यह त्रुटि का एक आम कारण है, क्योंकि प्रोग्रामर अक्सर भूल जाते हैं कि इस प्रकार को मशीनों पर हस्ताक्षर किया गया है। यह चेतावनी -Wall द्वारा सक्षम है।

तो इस चेतावनी को नकारात्मक सरणी अनुक्रमणिका का उपयोग करने से रोकना चाहिए। मेरा सवाल यह है कि यह चेतावनी केवल चार पर सक्रिय क्यों है और अन्य हस्ताक्षरित प्रकारों पर भी नहीं?

धन्यवाद।

+0

ध्यान दें कि आपको सरणी तत्वों के लिए 'size_t' का उपयोग करना चाहिए, न कि 'char'। – netcoder

उत्तर

8

ऐसा इसलिए है क्योंकि int हमेशा हस्ताक्षरित है।

char को नहीं करना है।

char कार्यान्वयन के आधार पर हस्ताक्षरित या हस्ताक्षरित किया जा सकता है। (तीन देखते हैं अलग-अलग प्रकार - char, signed char, unsigned char)

लेकिन समस्या क्या है? मैं सिर्फ 0 से 127 के मानों का उपयोग कर सकता हूं। क्या यह मुझे चुपचाप चोट पहुंचा सकता है?

ओह, हाँ यह कर सकता है।

//depending on signedess of char, this will 
//either be correct loop, 
//or loop infinitely and write all over the memory 
char an_array[50+1]; 
for(char i = 50; i >= 0; i--) 
{ 
    an_array[i] = i; 
    // if char is unsigned, the i variable can be never < 0 
    // and this will loop infinitely 
} 
+0

आह मैं इसे अब देखता हूं। Claryfiing के लिए धन्यवाद। चक्र में अनुक्रमण के लिए अच्छी नोक। धन्यवाद। – Mihalko

+0

@ मिहाल्को अच्छी तरह से, यह एक टिप नहीं है, यह एक चेतावनी है;) – milleniumbug

+1

यहां समस्या यह है कि आप लूप में char wuth '> = 0' की तुलना कर रहे हैं। सरणी अनुक्रमण पूरी तरह से अप्रासंगिक है। तो सूचकांक के बारे में चेतावनी क्यों दें? यह तुलना के बारे में चेतावनी दी जानी चाहिए, जो कुछ मशीनों पर हमेशा सच हो सकती है ... –

2

सादा डाल दिया, यह आपके सूचकांक character प्रकार के बारे में शिकायत कर रहा है।

बस pos को int पर कनवर्ट करें और चेतावनी गायब हो जाएगी।

इस चेतावनी के कारण क्यों, आपने इसे स्वयं कहा है। char डेटाटाइप केवल 0 - 255 (यदि हस्ताक्षरित है) से मूल्यों को संबोधित कर सकता है या यहां तक ​​कि केवल 127 (यदि हस्ताक्षरित हो)। एक सामान्य सरणी के लिए, यह एक मामूली संख्या है और आप signed बिट के बारे में जल्दी से भूल सकते हैं और गलती से सरणी स्थान -128 तक पहुंच सकते हैं (वास्तव में सरणी तत्व 128 तक पहुंच सकते हैं)।

जब तक आपकी सरणी 127 से छोटी हो, तब तक आप ठीक हो जाएंगे और आप चेतावनी को अनदेखा कर सकते हैं, लेकिन आइए ईमानदार रहें ... आपकी स्मृति पदचिह्न में ये तीन अतिरिक्त बाइट आपके आवेदन को अक्षम नहीं करेंगे यह?

+0

हां, मुझे पता है कि वहां चेतावनी क्यों है, लेकिन यह सोच रहा था कि क्यों जीसीसी केवल फॉट टाइप चार शिकायत करता है। वैसे भी mileniumbug के जवाब के रूप में यह स्पष्ट कर दिया। – Mihalko

0

क्योंकि देशी char या तो अहस्ताक्षरित या हस्ताक्षर किए जा सकता है।

ध्यान दें कि नकारात्मक सबस्क्रिप्ट का उपयोग करने के लिए यह सही कानूनी है।उदाहरण के लिए:

int arr[10]; 
int *ptr = arr[5]; 

अब मैं ptr[-1] जो arr[4] के बराबर है उपयोग कर सकते हैं। यदि char कार्यान्वयन में हस्ताक्षरित होता है, तो यह कभी भी ऋणात्मक मान नहीं हो सकता है।