2013-03-05 5 views
17

मैं स्वीकार करता हूं कि इनमें से तीनों का एक अलग अर्थ है। लेकिन, मुझे समझ में नहीं आता कि इनमें से प्रत्येक विशेष उदाहरण क्या लागू होगा। क्या इनमें से प्रत्येक के लिए कोई उदाहरण साझा कर सकता है? धन्यवाद।malloc (sizeof (int)) बनाम malloc (sizeof (int *)) बनाम (int *) malloc (sizeof (int))

 malloc(sizeof(int)) 
     malloc(sizeof(int *)) 
(int *)malloc(sizeof(int)) 

उत्तर

37

malloc(sizeof(int)) मतलब है कि आप ढेर एक int स्टोर करने के लिए बंद अंतरिक्ष का आवंटन कर रहे हैं। आप int के रूप में कई बाइट्स को आरक्षित कर रहे हैं। यह एक मान देता है जिसे आपको int * पर डालना चाहिए। ( int पर एक सूचक।) जैसा कि कुछ ने ध्यान दिया है, सी में सामान्य अभ्यास यह है कि निहित कास्टिंग इस पर ध्यान दें।

malloc(sizeof(int*)) का मतलब है कि आप एक पॉइंटर को int पर स्टोर करने के लिए ढेर से स्थान आवंटित कर रहे हैं। आप एक सूचक के रूप में कई बाइट्स आरक्षित कर रहे हैं। यह एक मान देता है जिसे आपको int ** पर डालना चाहिए। (एक int के सूचक के लिए एक सूचक।)

(int *)malloc(sizeof(int)) वास्तव में पहली कॉल के रूप में ही है, लेकिन परिणाम के साथ स्पष्ट रूप से एक int के लिए सूचक को casted।

ध्यान दें कि कई आर्किटेक्चर पर, int एक सूचक के समान आकार है, इसलिए ये सभी एक ही चीज़ होने के लिए (गलत तरीके से) लगेंगे। दूसरे शब्दों में, आप गलती से गलत काम कर सकते हैं और परिणामस्वरूप कोड अभी भी काम कर सकता है।

+1

+1 - मेरे अनुभव में हालांकि, कई सी प्रोग्रामर 'जानबूझकर' गलत काम करते हैं और यह काम करता है, इसलिए वे इसे जारी रखते हैं ..... – mattnz

+4

आरई पहला अनुच्छेद: सी में, कई लोग तर्क देते हैं कि आपको इसे नहीं डालना चाहिए (एक अंतर्निहित बातचीत है 'शून्य *' से सी में किसी भी सूचक प्रकार से, तो यह काम करता है)। Http://stackoverflow.com/q/605845/395760 – delnan

+0

देखें लोग धन्यवाद! – sabergeek

4

वाक्य रचना पैटर्न है कि सबसे सरल है:

int *p; 
p = malloc (cnt * sizeof *p); 

इस वाक्य रचना कोड बदलने के लिए आप के लिए मजबूर नहीं होगा यदि प्रकार (और या आकार ...) * पी परिवर्तन की, जैसे

में
struct mysstruct *q; 
q = malloc (cnt * sizeof *q); 

कौन से बचने जाएगा

struct mysstruct *z; 
z = malloc (cnt * sizeof(struct hisstruct)); // Auch! 

जैसी समस्याओं, प्लस: sizeof expr रूप भी है है horter।


अद्यतन: p = malloc(CNT * sizeof *p) की सत्यता को प्रदर्शित करने के लिए इस परीक्षण कार्यक्रम:

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

struct mystruct { 
     int i; 
     char s[14]; 
     }; 
int main(void) 
{ 
struct mystruct *p; 
size_t siz; 

siz = sizeof p; 
printf("Sizeof p := %zu\n", siz); 

siz = sizeof *p; 
printf("Sizeof *p := %zu\n", siz); 

printf("Allocating %zu (%u structs, each of size %zu) bytes to be assigned to p...\n" 
     , 10u * sizeof *p 
     , 10u, sizeof *p 
     ); 
p = malloc(10 * sizeof *p); 

return 0; 
} 

कौन सा यहाँ आउटपुट: अंतिम अनुच्छेद के लिए

Sizeof p := 8 
Sizeof *p := 20 
Allocating 200 (10 structs, each of size 20) bytes to be assigned to p... 
+0

पैटर्न 'malloc (cnt * sizeof * p) 'नहीं है, लेकिन स्वीकृत उत्तर सही ढंग से नोट किया गया है,' आकार पी '। Q/* q के लिए वही। अन्यथा आपको परिणाम को सही तरीके से पकड़ने के लिए 'int ** p' की आवश्यकता है। – EntangledLoops

+1

मैं आपके प्रश्न को समझ नहीं पा रहा हूं। 'टाइप * टी; टी = malloc (सीएनटी * आकार * टी); '** ** हमेशा ** सही है, अन्य रूपों * कभी कभी * सही हैं। – wildplasser

+0

यह कोई प्रश्न नहीं था और * नहीं *, यह हमेशा सही नहीं होता है। आप मान रहे हैं कि 'sizeof * t' = 'sizeof t', जो जरूरी नहीं है। आपकी रेखा को सही ढंग से पढ़ना चाहिए: 'टाइप * टी; टी = मॉलोक (सीएनटी * आकार टी); ' – EntangledLoops

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