मेरा एक साक्षात्कार था और मुझे यह कोड दिया गया था और पूछा गया था कि इनमें से प्रत्येक प्रिंटफ स्टेटमेंट का आउटपुट क्या है।

मेरे पास टिप्पणियों के रूप में मेरे उत्तर हैं, लेकिन मैं बाकी के बारे में निश्चित नहीं हूं।

क्या कोई कथन 1, 3 और 7 के लिए अलग-अलग आउटपुट की व्याख्या कर सकता है और क्यों?

शुक्रिया!

#include <stdio.h>

int main(int argc, const char * argv[]) {

    char *s = "12345";

    printf("%d\n", s);      // 1.Outputs "3999" is this the address of the first pointer?
    printf("%d\n", *s);     // 2.The decimal value of the first character
    printf("%c\n", s);      // 3.Outputs "\237" What is this value?
    printf("%c\n", *s);     // 4.Outputs "1"
    printf("%c\n", *(s+1)); // 5.Outputs "2"
    printf("%s\n", s);      // 6.Outputs "12345"
    printf("%s\n", *s);     // 7.I get an error, why?
    return 0;
}
1
Rami 17 अप्रैल 2018, 20:10

3 जवाब

सबसे बढ़िया उत्तर

मैंने आपका कोड चलाने के लिए निम्नलिखित ऑनलाइन C कंपाइलर का उपयोग किया है, और यहाँ परिणाम हैं:

1. 4195988            - undefined behaviour (UB), manifesting here as the address
                        of the char array as you stated (for a 64 bit address you might or
                        might not get truncation)
2. 49                 - ASCII value of '1'
3. �                  - undefined behaviour, manifesting here as unsupported ASCII value
                        for a truncation of the address of the array of chars
                        (placing 32-bit address into a char - assuming a 32-bit system)
4. 1                  - obvious
5. 2                  - obvious
6. 12345              - obvious
7. Segmentation fault - undefined behaviour, trying to place the first char
                        of a char array into a string reserved position
                        (placing char into a string)

बिंदु संख्या 3 पर ध्यान दें: हम रन-टाइम के दौरान क्या हुआ, इसका अनुमान लगा सकते हैं। प्रश्न में दिए गए विशिष्ट उदाहरण में -

printf("%c\n", s);      // 3.Outputs "\237". What is this value?

यूबी को संभालते समय यह एक हार्डवेयर/कंपाइलर/ओएस संबंधित व्यवहार है।

क्यों? आउटपुट "\237" के कारण -> इसका मतलब है कि इस कोड को निष्पादित करने वाले विशिष्ट हार्डवेयर सिस्टम के तहत !

कृपया नीचे स्पष्टीकरण देखें (धारणा - 32-बिट सिस्टम):

char *s = "12345"; // Declaring a char pointer pointing to a char array
char c = s; // Placement of the pointer into a char - our UB
printf("Pointer to character array: %08x\n", s); // Get the raw bytes
printf("Pointer to character: %08x\n", c); // Get the raw bytes
printf("%c\n", s); // place the pointer as a character
                   // display is dependent on the ASCII value and the OS
                   // definitions for 128-255 ASCII values

आउटपुट:

Pointer to character array: 004006e4  // Classic 32-bit pointer
Pointer to character: ffffffe4        // Truncation to a signed char
                                      // (Note signed MSB padding to 32 bit display)
�                                     // ASCII value E4 = 228 is not displayed properly

अंतिम प्रिंटफ कमांड char c = s; printf("%c\n", c); के बराबर है। क्यों? कटाव के लिए धन्यवाद।

वैध ASCII वर्ण आउटपुट के साथ एक अतिरिक्त उदाहरण:

    char *fixedPointer = 0xABCD61; // Declaring a char pointer pointing to a dummy address
    char c = fixedPointer; // Placement of the pointer into a char - our UB
    printf("Pointer to 32-bit address: %08x\n", fixedPointer); // Get the raw bytes
    printf("Pointer to character: %08x\n", c); // Get the raw bytes
    printf("%c\n", fixedPointer);

और वास्तविक आउटपुट:

Pointer to 32-bit address: 00abcd61
Pointer to character: 00000061
a
0
Peter Mortensen 28 अप्रैल 2018, 15:40

यह कॉल

printf("%d\n", s); 

अपरिभाषित व्यवहार है क्योंकि एक सूचक के साथ एक अमान्य प्रारूप विनिर्देशक का उपयोग किया जाता है।

यह कॉल

printf("%d\n", *s);

वर्ण '1' के आंतरिक कोड (उदाहरण के लिए ASCII कोड) को आउटपुट करता है।

यह कॉल

printf("%c\n", s);

एक सूचक के साथ एक अमान्य प्रारूप विनिर्देशक का उपयोग करने के कारण अपरिभाषित व्यवहार है।

ये कॉल

printf("%c\n", *s);
printf("%c\n", *(s+1));

वैध हैं। पहला वर्ण '1' को आउटपुट करता है और दूसरा एक वर्ण '2' को आउटपुट करता है।

यह कॉल

printf("%s\n", s);

सही है और स्ट्रिंग "12345" को आउटपुट करता है।

यह कॉल

printf("%s\n", *s);

अमान्य है क्योंकि एक अमान्य प्रारूप विनिर्देशक का उपयोग char प्रकार के ऑब्जेक्ट के साथ किया जाता है।

5
Rann Lifshitz 30 मई 2018, 10:42

7वीं पंक्ति विफल हो रही है क्योंकि इनपुट के रूप में एक सी शैली स्ट्रिंग अपेक्षित है, और आप इसके बजाय एक वर्ण रख रहे हैं।

पर एक नज़र डालें:

1
Rann Lifshitz 30 मई 2018, 10:43