2013-08-14 6 views
5

दिखा यहाँ C99 कोड का एक टुकड़ा है। मुझे समझ में नहीं आता क्यों sizeof(c)2 का तात्पर्य है क्योंकि मैंने c को एक स्ट्रिंग अक्षर के रूप में परिभाषित किया है जो तुरंत NULL समाप्त हो गया है। क्या कोई समझा सकता है कि यह मामला क्यों है? क्या आप एक (कुछ) संसाधन भी प्रदान कर सकते हैं जहां मैं अपने समय पर इस घटना की जांच कर सकता हूं।sizeof() अलग उत्पादन

+1

पढ़ने बराबर है [क्या sizeof (और आगमन) वापसी करता है?] (Http://stackoverflow.com/questions/15177420/what-does-sizeofarr-return/15177499#15177499) –

+1

याद रखें 'strlen() '- पहले nul –

+0

तक वर्णों की संख्या देता है यह भी पढ़ें: [5.2.1.2 कैरेक्टर सेट © आईएसओ/आईईसी आईएसओ/आईईसी 98 99: 201x] (https://is.muni.cz/www/408176 /38744863/International_Standard_for_C.txt): एक वर्ण निरंतर या स्ट्रिंग शाब्दिक में, निष्पादन वर्ण सेट के सदस्य स्रोत वर्ण सेट के संबंधित सदस्यों या बैकस्लैश के बाद से बचने वाले अनुक्रमों द्वारा प्रतिनिधित्व किए जाते हैं, जिसके बाद एक या अधिक वर्ण होते हैं। सभी बिट्स के साथ एक बाइट 0 पर सेट, जिसे शून्य वर्ण कहा जाता है, मूल निष्पादन चरित्र सेट में मौजूद होगा; यह एक चरित्र स्ट्रिंग को समाप्त करने के लिए प्रयोग किया जाता है। –

उत्तर

18

समझ में नहीं आया कि क्यों के आकार, एक अंतर्निहित समाप्त अशक्त चरित्र है 2.

एक स्ट्रिंग शाब्दिक दिखाया जा रहा है तो ch[] वास्तव में \0\0 है, इसलिए आकार दो है। अनुभाग से 6.4.5 स्ट्रिंग शाब्दिक C99 मानक के (मसौदा n1124), खंड 5:

अनुवाद चरण 7 में, एक बाइट या शून्य मूल्य का कोड प्रत्येक multibyte चरित्र अनुक्रम कि से परिणाम में जोड़ा जाता है एक स्ट्रिंग शाब्दिक या शाब्दिक

strlen() के लिए, यह पहली शून्य समाप्ति चरित्र से सामना करते समय गिनती रोकता है। लौटाया गया मान sizeof स्ट्रिंग युक्त सरणी से असंबंधित है। ch[] के मामले में, शून्य वापस किया जाएगा क्योंकि सरणी में पहले वर्ण एक शून्य टर्मिनेटर है।

+0

आपको यह भी कहना चाहिए कि स्ट्रेल 0 है क्योंकि पहला अक्षर शून्य है – SheetJS

+0

मैं आपसे सहमत हूं कि स्ट्रिंग ने शून्य चरित्र को समाप्त कर दिया है। अगर ch '' \ 0 \ 0 '' है तो स्ट्रेलन (सी) 1 होना चाहिए, लेकिन यह 0 – avinashse

+0

'strlen' रोकता है जब यह '\ 0' से मुकाबला करता है, जो' ch' का पहला अक्षर है। इसे '1' क्यों वापस करना चाहिए? – Nbr44

2

"\0""" जैसा नहीं है। स्ट्रिंग अक्षर शून्य-समाप्त होते हैं, इसलिए पहला यौगिक शाब्दिक (char){ 0, 0 } जैसा होता है जबकि दूसरा (char){ 0 } होता है। strlen पहला अक्षर शून्य होने के लिए पाता है, इसलिए स्ट्रिंग समाप्त होता है। इसका मतलब यह नहीं है कि डेटा समाप्त होता है।

2

आप एक स्ट्रिंग शाब्दिक रूप में घोषित जब:

char c[]="\0"; 

यह पहले से ही अंत में एक '\0' चरित्र है तो sizeof(c)2 देता है क्योंकि आपके स्ट्रिंग शाब्दिक वास्तव में है: \0\0

strlen(c) अभी भी 0 देता है क्योंकि यह पहले \0 पर बंद हो जाता है।

1

strlen पहले \ 0 करने के उपायों और इससे पहले कि \ 0 पात्रों में से गिनती देता है, तो इसका जवाब शून्य

एक चार एक्स [] पर sizeof बाइट्स जो दो है में प्रयोग किया जाता संग्रहण की मात्रा देता है, स्ट्रिंग

0

ग्रेट प्रश्न के अंत में स्पष्टीकरण \ 0 सहित। इस पर विचार करो ...

[email protected]:/tmp$ more x.c 
#include <stdio.h> 
#include <string.h> 

int main() { 
    char c[16]; 
    printf("%d %d\n",sizeof(c),strlen(c)); 
    return 0; 
} 
[email protected]:/tmp$ ./x 
16 0 
[email protected]:/tmp$ 

भी इस पर विचार करें:

[email protected]:/tmp$ more x.c 
#include <stdio.h> 
#include <string.h> 

int main() { 
    int c[16]; 
    printf("%d\n",sizeof(c)); 
    return 0; 
} 
[email protected]:/tmp$ ./x 
64 
[email protected]:/tmp$ 

जब आप एक सरणी के रूप में एक चर को प्रारंभ (जो प्रभावी रूप से है क्या सी [] है), sizeof (ग) आप सरणी के आवंटित आकार दे देंगे ।

स्ट्रिंग "\ 0" शाब्दिक स्ट्रिंग \ NUL \ NUL है जो दो बाइट लेती है।

दूसरी ओर, strlen() स्ट्रिंग लंबाई जो पहले समाप्ति चरित्र की स्ट्रिंग में ऑफसेट है की गणना करता है और कहा कि पता चला है शून्य होने के लिए और इसलिए आप 2 मिलता है, 0.

3

सी में, "" का अर्थ है: मुझे एक स्ट्रिंग दें और इसे मेरे लिए समाप्त करें।

उदाहरण arr[] = "A" के लिए पूरी तरह से arr[] = {'A', '\0'};

के बराबर है इस प्रकार "\0" साधन: मुझे एक स्ट्रिंग एक अशक्त समाप्ति युक्त देते हैं, तो मेरे लिए इसे समाप्त शून्य।

arr [] = "\0" "करने के लिए arr[] = {'\0', '\0'};

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