realloc function in C

या पुर्वी आपण Dynamic Memory allocate करण्यासाठी C language च्या library मधील malloc आणी calloc हि दोन फंक्शन्स कशी काम करतात हे पाहीले. त्याच family of functions मधील हे अजून एक फंक्शन म्हणजे realloc function. Academic level मध्ये त्याचा फारसा उपयोग केला जात नसला तरी system level programming मध्ये या फंक्शनचा वापर केला गेला जातो. अर्थात विद्यार्थ्यांना हे वापरायची गरज भासली नाही तरी त्याचे कार्य कसे चालते हे माहीतच हवे कारण interview किंवा viva मध्ये असे प्रश्न विचारले जावू शकतात.

realloc function नावा प्रमाणेच मेमरी re-allocate करण्यासाठी वापरले जाते. प्रथम त्याचा प्रोटोटाइप काय आहे ते बघू.

void* realloc(void* ptr, size_t size);

malloc अथवा calloc function वापरून जर आपण dynamic allocation करून heap वरून मेमरी उधार घेतली असेल तर असे सुद्धा होउ शकते की रन टाइम ला घेतलेली मेमरी जरूरी पेक्षा कमी आहे व already data store केला आहे किंवा मेमरी गरजे पेक्षा जास्त घेतली आहे व data भरल्या नंतर उरलेली मेमरी वाया जाणार आहे. अशा दोनही परीस्थिती मध्ये जुन्या data ला धक्का न लावता तुम्हाला नवीन मेमरी जर allocate करायची असेल तर realloc function वापरले जाते. प्रोटोटाइप मध्ये दाखवल्या प्रमाणे या  फंक्शन मध्ये पहीले argument जे आहे (ptr) ते malloc अथवा calloc ने allocate केलेल्या मेमरी चा pointer आहे. तर दुसरे argument आपल्याला नवीन मेमरी किती bytes हवी आहे ते सांगते.

realloc function एकूण ४ कामे पार पाडते

  1. जेवढी नवीन मेमरी मागीतली आहे त्याची व्यवस्था करते. जास्त हवी असेल तर त्यावेळी हे फंक्शन जुन्या मेमरी ला लागूनच नवीन मेमरी देण्याचा प्रयत्न सुद्धा करते पण हे सगळे अनेक factors वर अवलंबून असते. realloc01
  2. जर पुर्णपणे नवीन मेमरी दिली असेल तर जुना डेटा नवीन मेमरी मध्ये कॉपी करण्याचे काम करतेrealloc02
  3. जुन्या डेटा साठी जी मेमरी allocate केलेली असते ती de-allocate करते
  4. allocate केलेल्या नवीन मेमरी चा void pointer return करते
  5. अर्थात malloc आणी calloc प्रमाणेच मेमरी allocate झाली नाहीतर realloc सुद्धा NULL return करून मोकळे होते.

एक छोटा प्रोग्रॅम खाली दिला आहे. व त्याचे output सुद्धा दिले आहे. त्या वरून साधारणपणे तुम्हाला realloc ची पद्धत समजू शकेल.

#include<stdio.h>
int main()
{

int num, i;
int newnum;
int* ptr;
int* newptr;

printf(“How many numbers you want to storet”);
scanf(“%d”,&num);

ptr = (int*) malloc(num * sizeof(int));
for(i=0;i<num;i++)
{

printf(“Enter Numbert”);
scanf(“%d”,&ptr[i]);

}
printf(“You have storedn”);
for(i=0;i<num;i++)
{

printf(“%4d”,ptr[i]);

}
printf(“nnOriginal Memory Location = %un”,ptr);
printf(“nn”);

printf(“How many more numbers you want to storet”);
scanf(“%d”,&newnum);

newptr = (int*) realloc(ptr,(newnum+num)*sizeof(int));
for(i=num;i<(newnum+num);i++)
{

printf(“Enter Numbert”);
scanf(“%d”,&newptr[i]);

}
printf(“nnOriginal Memory Location = %un”,newptr);
printf(“You have storedn”);
for(i=0;i<(newnum+num);i++)
{

printf(“%4d”,newptr[i]);

}

free(newptr);
return 0;

}

Sample Output

Untitled


			

malloc in C

See on Scoop.itC Programming Language

Dynamic memory allocation करण्यासाठी C language मध्ये library मध्ये असणारी हि फंक्शन्स. पण अनेक वेळा याची तोंड ओळख Data Structure शिकतांना होते. पण त्यावेळी stack, queues, linked lists, binary tree…

C Marathi‘s insight:

Dynamic Memory Allocation in C Programming Language

See on cmarathi.wordpress.com

calloc() in C

Run time च्या वेळी heap वरून मेमरी allocate करायची असेल तर आपल्याकडे malloc, calloc आणी realloc अशी ३ फंक्शन्स library मधील Dynamic Memory Allocation च्या family मधील आहेत.

malloc चा उच्चार ज्या प्रमाणे मॅलॉक अथवा एम ऍलॉक करतात त्याच प्रमाणे calloc चा कॅलॉक अथवा सी ऍलॉक असा सुद्धा काहीजण करतात.

हि सर्व family लायब्ररी मधील stdlib.h या header file मध्ये आहे.

calloc चा prototype :

void* calloc(size_t num, size_t size);

calloc चा syntax :

calloc.fw_

असा  आहे. calloc दोन arguments घेते. पहीले म्हणजे कीती elements साठी मेमरी ब्लॉक हवा व दुसरे म्हणजे प्रत्येक element कीती bytes घेतो. calloc function चा return type हा malloc function प्रमाणेच void pointer आहे जो block of memory ला point करतो.

malloc आणी calloc मध्ये दोन फरक आहेत पण महत्वाचा एकच आहे.

calloc function ला 2 arguments पाठवायला लागतात तर malloc function ला 1 argument पाठवायला लागते.
calloc function हे heap वर memory allocate केल्या नंतर 0 (Zero) ला initialize करते तर malloc function ने allocate केलेल्या memory मध्ये garbage values असतात. त्यामुळेच calloc शब्द allocate and clear या दोन शब्दावरून झाला असावा.

malloc function प्रमाणेच calloc function ने return केलेला void pointer एखाद्या pointer variable ला assign करण्यापुर्वी typecast करून घेतला जातो.
malloc प्रमाणेच calloc function सुद्धा memory allocate करण्यास असमर्थ ठरले तर Null Pointer return करून मोकळे होते…!

समजा एखाद्या स्ट्रक्चरचे १० elements हिपवर तयार करायचे आहेत…तर

#include<stdio.h>
#include<stdlib.h>
typedef struct player
{

char name[50];
int tests;
int runs;
int nout;
float average;

}cricketplayer;
int main( )
{

cricketplayer *cp;
cp = (cricketplayer*) calloc(10, sizeof(cricketplayer));
if(cp == NULL)
{

printf(“Memory can not be allocatedn”);
exit(EXIT_FAILURE);

}

/* Rest of the Program */

}

calloc कधी वापरावे आणी malloc कधी वापरावे असे प्रश्न अनेक वेळा उपस्थित होतात. त्यासाठी असा काही नियम नाही कारण त्यामध्ये एक महत्वाचा फरक सोडल्यास फारसा काही फरक नाही… अर्थात तरीसुद्धा

  • जास्त प्रमाणात मेमरी heap वरून लागत असेल तर malloc च्या ऐवजी calloc वापरावे असे जाणकार advice देतात
  • आपल्याला मिळालेल्या मेमरी मध्ये garbage असणारच आहे असे माहीत असतांना calloc कडुन clear असलेली मेमरी कधीही उपयुक्त
  • स्ट्रक्चर चे अनेक elements जर heap वर एकाच वेळी हवे असतील तर calloc वापरणे कधीही श्रेयस्कर…!
  • heap वर allocate केलेल्या मेमरीमधील Data वर जर manipulation करायचे असेल तर सुद्धा calloc prefer करावे

malloc in C

Dynamic memory allocation करण्यासाठी C language मध्ये library मध्ये असणारी हि फंक्शन्स. पण अनेक वेळा याची तोंड ओळख Data Structure शिकतांना होते. पण त्यावेळी stack, queues, linked lists, binary trees, sorting and searching ची techniques विद्यार्थ्यांचा इतका घाम काढत असतात की या महत्वाच्या फंक्शन्स कडे दुर्लक्ष होउन जाते.

महाराष्ट्रातील काना-कोपऱ्यात अजूनही TC compiler वापरला जातो. शहरी व निम-शहरी भागातील कॉलेज मध्ये सुद्धा TC वापरला जातो. म्हणून DOS based TC चा संदर्भ घेउन post केलेली आहे. अर्थात साधारणपणे Linux/Unix/Windows based Compiler वर काम करतांना malloc च्या functionality मध्ये फारसा फरक पडत नाही. Concept समजणे महत्वाचे…!

त्या साठी आपण मेमरी चे सर्वसाधारण स्ट्रक्चर पाहीले पाहीजे.

C program लिहीतांना broadly एकंदरीत दोन प्रकारची व्हेअरेबल्स डिक्लेअर केली जातात.

  • Function च्या आत (Local Storage)
  • Function च्या बाहेर (Global Storage)

C program ज्यावेळी तुम्ही लिहीता त्यावेळी कोड स्टोअर करण्यासाठी कोड सेगमेंट, आणी डेटा स्टोअर करण्यासाठी डेटा सेगमेंट दिला जातो. अर्थात या डेटा सेगमेंट आणी कोड सेगमेंट याची size, number हे कंपायलर, ऑपरेटींग सिस्टीम, architecture इत्यादी अनेक  बाबींवर अवलंबून असते.

डेटा सेगमेंट हा शक्यतो तीन पार्ट मध्ये divide केलेला असतो. तो म्हणजे static/global memory area, heap आणी stack.

#include<stdio.h>
int p;
int main()
{

int x;
float j;
char ch;
static int y;
int* ptr;
printf(“Address of x = %un”,&x);                               // allocation on the stack
printf(“Address of j = %un”,&j);                                 // allocation on the stack
printf(“Address of ch = %un”,&ch);                          // allocation on the stack
printf(“Address of y = %un”,&y);                              // allocation in the static/global memory
printf(“Address of p = %un”,&p);                             // allocation in the global/static memory
ptr = (int*) malloc(sizeof(int));                                   // allocation from heap
printf(“Contents of ptr = %un”,ptr);
return 0;

}

Static/Global Memory area

जी व्हेअरेबल्स तुम्ही फाइल स्कोपला म्हणजेच function च्या बाहेर डिक्लेअर करता त्याना या मेमरी area मध्ये रहायला जागा दिली जाते. मग ती global असतील अथवा static असतील.

Data Segment

Data Segment

Stack

जी व्हेअरेबल्स तुम्ही function किंवा Block scope (Local Variables) ला declare करता त्या मध्ये ३ प्रकारची व्हेअरेबल्स असू शकतात. auto, static आणी register. हे तिनही keywords आहेत. त्यापैकी auto variables ला stack मध्ये उठ-बस करण्याची परवानगी दिली जाते. Local Static variables मात्र Global/Static memory area मध्ये रहाणे पसंत करतात.

Heap

डॆटा सेगमेंटचा तिसरा उर्वरीत भाग म्हणजे heap.

Run time ला मेमरी allocate करायची असेल तर हि सर्व मेमरी heap वरून दिली जाते. Static/Global memory area व Stack वर दिल्या जाणाऱ्या मेमरीला नाव असते जे व्हेअरेबल्सच्या नावाने ओळखले जाते मात्र heap वरून दिल्या जाणाऱ्या मेमरीला नाव नसते(Unnamed Memory). त्यामुळे ही मेमरी access करतांना pointer ची मदत घेण्याशीवाय पर्याय नसतो….

अशा वेळी C Language program करतांना run time ला memory घ्यायची असेल तर library मध्ये malloc आणी calloc आणी realloc अशी तीन फंक्शन्स आहेत. पण calloc आणी realloc फंक्शन्स आपण वेगळ्या post मध्ये पाहू.

malloc या फंक्शनचा प्रोटोटाइप असा आहे…

void* malloc (size_t);

म्हणजेच हे फंक्शन heap वर किती bytes मेमरी लागणार आहे (याला Memory Block असे म्हणतात)  हे argument घेते व  memory block चा pointer return करते….पण त्याचा (pointer) data type void असतो. कारण रन टाइम ला मेमरी देतांना त्याला माहीत नसते की तुम्ही हि मेमरी कोणत्या प्रकारच्या पॉइंटर साठी वापरणार आहात ते.

Bank Cashier

जसे बँकेमध्ये तुम्ही गेलात व तुमच्या account वरून १०००० रु. काढले तर cashier ला माहीत असायचे काहीच कारण नाही की हे पैसे तुम्ही कोणत्या कारणा करीता वापरणार आहात ते. त्यामुळे १००० च्या १० नोटा द्यायच्या कि १०० च्या १०० द्यायच्या कि १० च्या १००० नोटा द्यायच्या या confusion मध्ये तो अडकु शकतो. अर्थात माणूस असल्यामुळे काही denomination करून तुम्हाला तो देइलही पण समजा त्याने काहीच intelligence वापरला नाही तर सरधोपट मार्गाने तो तुम्हाला १ रुपयाची १०००० नाणी देइल. void pointer return करण्याचे काम काहीतरी अशाच प्रकारचे आहे

त्यामुळेच ज्या प्रकारच्या डॆटाटाइपचा pointer आपल्याला हवा आहे असे त्याला सांगणे जरूरी असते. म्हणून वरील program मध्ये दाखवल्या प्रमाणे malloc च्या पुर्वी int* असे लिहीले आहे. याला आपण typecasting म्हणतो व expression मध्ये उजव्या साइड कडुन आलेला व malloc ने return केलेला void pointer integer pointer मध्ये typecast (As good as convert) करण्याचे काम करतो.

वरील बॅंकेच्या example मध्ये जसे तुम्ही cash counter ठिकाणी cashier ला सांगाल की तुम्हाला १००० च्या १० नोटा हव्या आहेत…! हा एक Typecasting चा प्रकारच आहे ना…!

अर्थात मेमरी run time ला मिळण्यासाठी तुम्ही request केली आहे…जी honor (Accept) होइल अथवा होणार नाही…Request honor झालीच तर malloc function void pointer return करतेच पण नाही झाली तर का झाली नाही हे सांगण्याचे बंधन त्यावर नाही…त्यामुळे तो NULL Pointer return करून टाकतो…

या ठिकाणी एक int, एक float, एक char, १० integers elements साठी आणी एक स्ट्रक्चर element साठी मेमरी heap वरून run time ला हवी असेल तर

#include<stdio.h>

typedef struct birthdate
{

int day;
int month;
int year;

}BIRTHDATE;
typedef struct student
{

int roll_no;
char name[50];
char address[100];
char gender;
char bloodgroup[5];
BIRTHDATE d;

}student;
int main()
{

int *x;
float *y;
char *ch;
int *num;
student *ptr;
x = (int*) malloc(sizeof(int));
y = (float*) malloc(sizeof(float));
ch = (char*) malloc(sizeof(char));
num = (int*) malloc(10 * sizeof(int));
ptr = (student*) malloc(sizeof(student));
return 0;

}

या ठिकाणी वर सांगीतल्या प्रमाणे एका integer साठी, एका float साठी आणी एका character साठी heap वर मेमरी allocate केली जाइल व प्रत्येक मॅलॉक स्टेटमेंट मध्ये malloc ने return केलेले void pointer हे typecast केले जातील. num या integer pointer साठी malloc function मध्ये sizeof(int) ला 10 ने multiply केल्या मुळे malloc 10 integer elements साठी जितके bytes लागतील तितका memory block देउन टाकेल.

  1. एक स्ट्रक्चर variable सुद्धा declare केले आहे. खरं तर sizeof या operator चा उपयोग व महत्व काय हे येथे प्रकर्षाने जाणवते. कारण एक स्ट्रक्चर मेमरी किती मेमरी घेइल हे अंदाज वर्तवण्याचे काम तुम्हाला करायला लागत नाही.
  2. दुसरे महत्वाचे म्हणजे वरील program मध्ये x, y, ch, num, s या सर्व pointer variables ला स्वत:ला आवश्यक असणारी memory मात्र stack वरून घेतली जाते हे लक्षात घ्या….!
  3. तिसरा महत्वाचा concept म्हणजे stack वरील variables त्या फंक्शन मधून control बाहेर पडल्यानंतर automatic pop होतात पण heap वरील मेमरी मात्र release करण्याची जबाबदारी मात्र programmer वर आहे. म्हणून
  4. free नावाचे फंक्शन मात्र कॉल करणे जरूरीचे असते. त्याचा प्रोटोटाइप void free(void*); असा आहे. त्यामुळे free(x), free(y), free(ch), free(num) अशा प्रकारची स्टेटमेंटस लिहून memory release करावी लागेल.
  5. शेवटचा महत्वाचा concept म्हणजे वर सांगीतल्या प्रमाणे heap वरून मेमरी देण्याचे काम जर malloc कडून पार पडले नाही तर malloc function मात्र Null Pointer return करत असल्यामुळे त्याचा चेक घेणे हे नेहमी महत्वाचे जसे की malloc function call नंतर तुम्हाला साधारणपणे अशा प्रकारचे स्टेट्मेंट लिहावे लागेल.

if(ptr == NULL)
{

printf(“Memory can not be allocatedn”);
exit(EXIT_FAILURE);

}
वरील बॅंकेच्याच example मध्ये तुम्ही बॅंकेत भरलेला चेक जर bounce झाला असेल तर पैसे कमी होते म्हणून, कि सही चुकली असेल म्हणून, कि तारीख चुकली असेल, कि अजून काही कारणामुळे हे तुम्हाला गोंधळात टाकते असाच काहीतरी प्रकार आहे.

Null Pointer

नाव वाचून definition द्यायला सोपा, वापरायला सोपा पण समजायला अवघड असा काहीतरी हा प्रकार आहे. एक तर एखाद्या डेटा-टाइपचा pointer म्हणजे त्याच प्रकारचा डेटाटाइप असलेल्या व्हेअरेबलचा address स्टोअर करण्यासाठी लागणारे variable अशी व्याख्या करता येइल. उदा:

#include<stdio.h>
int main( )
{

int* ptr;
int x;
ptr = &x;
*ptr = 5;
return (EXIT_SUCCESS);

}

Null Pointer

Null Pointer

वरील स्टेटमेंट मध्ये ptr हा इंटीजर पॉइंटर असून x या इंटीजर व्हेअरेबलचा address या पॉइंटर मध्ये ठेवला आहे. या केस मध्ये ptr व x ही दोनही व्हेअरेबल्स local variables असल्यामुळे त्यांनी stack वर जागा अडवली आहे. अर्थात जर आपण ptr साठी मेमरी run time ला घ्यायची ठरवली तर…

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

int main( )
{

int* ptr;
ptr = (int*) malloc(sizeof(int));
*ptr = 5;
return (EXIT_SUCCESS);

}

असा लिहायला लागेल. अर्थात malloc call केल्या नंतर मेमरी allocate झाली आहे की नाही हे काम केलेले नाही..कारण heap वर मेमरी नाही तर null pointer return होतो असा C Documentation मध्ये उल्लेख आहे. म्हणून  आपण त्या नंतर check करतो. जसे की…

#include<stdio.h>
#include<stdlib.h>
int main( )
{

int* ptr;
ptr = (int*) malloc(sizeof(int));
if(ptr == NULL)
{

printf(“Memory can not be allocatedn”);
exit (EXIT_FAILURE);

}
*ptr = 5;
return (EXIT_SUCCESS);

}

या ठिकाणी जर condition true झाली तर Null pointer return झाला आहे असे समजायचे….प्रश्न असा आहे कि Null Pointer म्हणजे काय return होते…?

प्रत्येक प्रकारच्या pointer साठी Null Pointer ची value ठरलेली असते व ती system dependent, architecture dependent व compiler dependent असते असे ISO C चे Documentation सांगते. Null Pointer हा अशा प्रकारचा pointer असतो जो कुठेही पॉइंट करत नाही. C मध्ये त्या मध्ये 0 (Zero) value असते.

  • Null Pointers compare करता येतात.
  • Null Pointer व void pointer चा अर्थाअर्थी काही एक संबंध नाही.
  • Null Pointer व uninitialized pointer मध्ये फरक आहे.

एखाद्या माणसाला काही तरी शोधून आणायला सांगीतले आणी मोकळ्या हाताने परत आला व विचारल्या नंतर योग्य ते उत्तर दिले नाही…(म्हणजे त्याने शोधले कि नाही अथवा शोधले पण आळस केला अथवा जी वस्तू शोधायला पाठवली ती तिथे नव्हतीच मुळी किंवा अन्य काही कारण असेल तर नेमक्या कोणत्या कारणामुळे तो परत आला हे तो सांगू शकत नसेल किंवा आपल्याला कळत नसेल) तर  आपण “तो हात हलवत परत आला” असे मराठीत वापरतो. Null Pointer आणी malloc function हे साधारणपणे तसेच काहीतरी प्रकरण आहे….

या विरुद्धा uninitialized pointer मात्र वेगळा असतो. त्या मध्ये कोणता address असेल त्याचा नेम नाही व तो कुठेना कुठे point करत असतो. भरकटलेल्या माणसाप्रमाणे….!

if you really like to learn any programming concepts in this interesting manner then watch similar videos on  http://www.cmarathionline.com/switch-case-intro01/

size_t

C programming शिकलेल्या अथवा शिकणाऱ्या अनेक विद्यार्थ्यांना size_t हा नवीन शब्द कधी कधी गोंधळात टाकतो. जसे की
१. नेमका हा शब्द काय आहे?
२. तो कोणत्या ठिकाणी वापरायचा
३. तो कसा वापरायचा इत्यादी…

डेनीस रिची नी १९७१ मध्ये C language लिहील्यानंतर त्याची प्रसिद्धी पाहता सर्व जगामध्ये या language चे एकच standard असावे अशी परीस्थिती निर्माण झाली. मग १९८४ ते १९८९ या ६ वर्षांच्या काळात एक standard तयार करण्यात आले. असे करतांना अनेक बदल सुद्धा करण्यात आले. पण हे सर्व करतांना C च्या मुळच्या concepts ना धक्का न लावण्याची काळजी घेण्यात आली. हे सर्व करण्यामागे American National Standard Institute हि अमेरीकेतील संस्था होती.
ansi logo
हे standard १९८९ मध्ये प्रसिद्ध केल्यानंतर जगभर मान्य झाले म्हणून नंतर C च्या स्टॅंडर्ड version ला ANSI C असे ओळखू लागले तसेच त्याला C89 असेही म्हणू लागले.
त्या नंतर C language च्या standard ची दखल ISO या जागतिक संघटनेला सुद्धा दखल घ्यावी लागली व त्यांनी १९९० मध्ये त्याचे (ANSI C) चे standard adopt केले.
2012_iso-logo_print
ISO हि अनेक क्षेत्रामधील नामांकीत standardization करणारी संस्था असल्यामुळे ANSI C च्या ऐवजी ISO C या नावाने ती ओळखली जावी अशी इच्छा ISO पदाधिकाऱ्यांची होती. त्यासाठी त्यांनी १० वर्षे पुन्हा C च्या standard वर काम करून C99 हे नवीन standard सुचवले.
याच ISO ने C मध्ये size_t हा नवीन डेटाटाइप C99 मध्ये सुचवण्यात आला.
C language चे नाव ANSI C च्या ऐवजी ISO C असावे म्हणून Officially तशी घोषणा सुद्धा झाली. अर्थात ती प्रोग्रॅमर मंडळी मध्ये रुळली नाही.

int या बेसीक डेटाटाइप मध्ये positive व negative integer constants स्टोअर करता येतात. पण अनेक वेळा काही काही entities अशा प्रकारच्या असतात कि ती entity negative value कधीच घेउ शकत नाही. खरं तर त्यासाठी डेनीस ने unsigned int असा ही डेटाटाइप दिला होता. पण त्याचा काही फारसा वापर झाला नाही. कारण प्रोग्रॅमर सरसकट int datatype च वापरायचे.

म्हणून ISO ने C99 मध्ये sizeof opearator वापरतांना व malloc/calloc/realloc फंक्शन कॉल करतांना size_t या डेटाटाइपचा वापर करावा असा दंडक घालून दिला. याला कारण म्हणजे
१. Data type ची size काढतांना ती negative नसणार…
२. Memory allocate केली जात असतांना ती negative नसणार….

sizeof(int) चा result हा positive असतो…त्यामुळेच size_t हा याच्याशी निगडीत केला गेला. तसेच malloc, calloc, realloc चे proptotype मध्ये size_t चा वापर केला गेला…उदा.

void* malloc(size_t size);
void* calloc (size_t num, size_t size);
void *realloc(void *ptr, size_t size);

विद्यार्थ्यांनी हा डेटाटाइप वापरला पाहीजे पण त्यापुर्वी याची माहीती करून घेउनच नंतर…!

पण असेच काही कंटेंट्स व्हिडीओ स्वरूपात पहायचे असतील तर http://www.cmarathionline.com/summary-of-c-marathi-project/

sizeof operator in C Language

C आणी C++ या languages मध्ये Data type चा size काढण्यासाठी या ऑपरेटरचा उपयोग करतात. उदा.
॑#include<stdio.h>
int main()
{

int a;
float b;
char ch;
printf(“%d…%d…%dn”,sizeof(int), sizeof(float), sizeof(char));
printf(“%d…%d…%dn”,sizeof(a), sizeof(b), sizeof(ch));

}

हा प्रोग्रॅम कंपाइल आणी रन केला तर आउटपुट २, ४, आणी १ अथवा ४, ४, १ अथवा ज्या कंपायलरवर तुम्ही प्रोग्रॅम रन करता त्यावर int, float, char ला लागणाऱ्या number of bytes ची संख्या तो सांगेल. गंमत म्हणजे याचा वापर करतांना ज्या पद्धतीने तो वापरावा लागतो त्याला बघून आपल्याला ते फंक्शन वाटते व तसा गैरसमज सुद्धा होतो. पण ते फंक्शन नसून ऑपरेटर आहे. अर्थात असा प्रश्न तुम्हाला विचारला गेला तर यासाठी सबळ कारणे द्यावी लागतील…तर मग का तो ऑपरेटर आहे…?
१. फंक्शन ला address असतो पण operator ला address नसतो
२. Operand of sizeof can be bare cast…i.e. sizeof(int) can be written. In case of function you have to write argument as constant or variable)
३. sizeof च्या पुढे round bracket टाकला नाही तरी चालतो. म्हणजेच वरील प्रोग्रॅम मध्ये दुसऱ्या printf स्टेटमेंट मध्ये sizeof(a) च्या ऐवजी sizeof a असे लिहीले तरी चालते. फंक्शन च्या बाबतीत round brackets टाकावेच लागतात.
४. sizeof हा run time ला execute होत नाही. So expression like sizeof(a++) will not modify value of variable a
५. sizeof या expression round brackets मध्ये void व्यतीरीक्त कोणताही operand असू शकतो. फंक्शनच्या बाबतीत मात्र void सुद्धा असू शकतो.

Dynamic Memory allocate करतांना malloc, calloc आणी realloc या library फंक्शनचा वापर केला जातो.
उदा. आपल्याला heap वरून 1 integer, 1 float आणी 1 character साठी मेमरी हवी आहे. तर आपल्याला प्रोग्रॅम असा लिहावा लागेल…
void main()
{

int* x;
char* y;
float* z;
x = (int*) malloc(sizeof(int));
y = (char*) malloc(sizeof(char));
z = (float*) malloc(sizeof(float));

}

या मध्ये sizeof(int), sizeof(char), sizeof(float) च्या ऐवजी 2, 1, 4 असे लिहून चालणार नाही काय असा प्रश्न Beginner C programmer ना पडतो. असं चालत पण cross plat form programming करतांना दुसऱ्या मशीन वर int ला 4 byte लागत असतील तर तुमचा प्रोग्रॅम काम करणार नाही.

दुसरे कारण म्हणजे समजा एखादे स्ट्रक्चर डिक्लेअर केले आहे व त्या मध्ये अनके डेटा मेंबर्स आहेत आणी स्ट्रक्चर च्या व्हेअरेबल साठी मेमरी heap वरून घ्यायची आहे. तर मग sizeof operator वापरून तुम्हाला तुमची जबाबदारी कंपायलरवर झटकून टाकता येते.
फक्त जबाबदारीचा प्रश्न नसून स्ट्रक्चर साठी लागणाऱ्या मेमरीचे calculation करण्याची कंपायलरची पद्धत ही manual पद्धतीपेक्षा वेगळी असू शकते कारण मेमरी पॅडींग करण्यासाठी त्याला काही व्यवस्था करावी लागते.

If you want to learn C programming language in Marathi visit our web site http://www.cmarathionline.com/history-of-c-language/