2015-06-23 14 views
5

में त्रुटि मैं यहाँ इस कोड ::सी ++ में ठीक काम करता है, लेकिन क्रम सी

int f(int x, int *py, int **ppz) 
{ 
    int y, z; 
    **ppz += 1; 
    z = **ppz; 
    *py += 2; 
    y = *py; 
    x += 3; 
    return x + y + z; 
} 

int main() 
{ 
    int c, *b, **a; 
    c = 4; 
    b = &c; 
    a = &b; 
    printf("%d\n", f(c,b,a)); 
    printf("%d\n", c); 
} 

जब मैं एक सी के रूप में इस कोड को चलाने ++ प्रोग्राम (कृपया हेडर फाइल तदनुसार चुनें), यह है आसानी से दौडें। लेकिन, जब मैं एक सी कार्यक्रम के रूप में इसे चलाने के लिए, यह इसके निष्पादन पूरा करता है, सभी मूल्यों प्रिंट, लेकिन कोड की अंतिम पंक्ति पर, एक रनटाइम त्रुटि देता है। मैं एक डिबगर संलग्न है, और कार्यक्रम के अंत चरण से अधिक क्लिक करने पर (सी में इस कोड को चलाने के दौरान), यह मुझे एक min_gw फाइल करने के लिए ले जाता है, जो इस ::

__mingw_CRTStartup() 
__mingw_CRTStartup+208: mov %eax,%ebx 
__mingw_CRTStartup+210: call 0x407fb0 <_cexit> 
__mingw_CRTStartup+215: mov %ebx,(%esp) 
__mingw_CRTStartup+218: call 0x408088 <[email protected]> 
__mingw_CRTStartup+223: nop 

तरह दिखता है पर क्या क्या यह फाइल है ?? और कोड सी में विफल क्यों होता है ??

Ideone संदर्भ ::

सी :: http://ideone.com/sDbqnI

सी ++ :: http://ideone.com/Ubb71k

पहले से कोई मदद के लिए धन्यवाद .. :)

+7

दोनों कार्यक्रमों ठीक कर रहे हैं। विचार रनटाइम त्रुटि रिपोर्ट करता है क्योंकि आपका 'मुख्य' मूल्य लौटाए बिना अंत तक पहुंचता है। – dasblinkenlight

+1

@dasblinkenlight नहीं, यह यूबी अंत होकर गिरते (और उपयोग मूल्य है, जो क्रम करता है) है। – o11c

+1

dasblinkenlight: आपको इसे एक उत्तर के रूप में पोस्ट करना चाहिए। – amaurea

उत्तर

11

सी के ++ सभी संस्करणों, और सी 99 के बाद से, अंत से गिरने से पहले मुख्य के अंत में एक अंतर्निहित return 0; जोड़ें।

C89 (जो सबसे compilers के लिए डिफ़ॉल्ट है) नहीं है, तो यह यूबी है अगर आप वास्तव में अंत से गिरकर मुख्य से लौटने।

संपादित करें: प्रैक्टिस में (मान लीजिए कि आप sanitizers के बिना चल रहे हैं), इसका मतलब है कि आप जो भी हो, वह पहले से ही $eax में होने वाले कार्यों को वापस कर देगा, यानी अंतिम कार्य का वापसी मूल्य। चूंकि printf आमतौर पर एक गैर-शून्य मान देता है, जिसे विफलता के रूप में माना जाता है।

+2

जैसा कि मैं समझता हूं, सी 99 मानक के रूप में, यह सी में भी अंतर्निहित रूप से जोड़ा जाता है। – wjl

+0

@wjl 5.1.2.2.3, हाँ। – o11c

+0

आपको सूची में सी 11 जोड़ना चाहिए। – Olaf

0

आप मुख्य संकेत सफलता के अंत में वापसी कथन भूल गया।

+0

वह 'वापसी 0' होगा। यह स्वचालित रूप से 'मुख्य()' के लिए किया जाता है। इसके लिए कोई वास्तविक आवश्यकता नहीं है। – Olaf

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