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

function pointer in C

C programming language मध्ये असे काही topics आहेत कि ते अभ्यासक्रमात घेतले जात नाहीत अथवा इतक्या brief मध्ये संपवले जातात कि त्या topics विषयी अज्ञान किंवा भिती अथवा दोनही कायमच्या रहातात. function pointer हा अशाच प्रकारचा एक टॉपीक.  Typecast, bit fields, union, bit operators पेक्षा सुद्धा जास्त सापत्नपणाची (Step-motherly treatment) वागणूक मिळालेल्या या टॉपीकविषयी मी लिहीणार आहे. कारण C++ मध्ये virtual function या महत्वाच्या chapter चे fundamental concepts या topic मध्ये दडून बसलेले आहेत.

हव तर pointer म्हणजे काय हे एकदम सोप्प्या भाषेत समजावून घ्यायच असेल तर हा व्हिडीओ पहाच

प्रथम integer pointer, character pointer, float pointer या सारखे साधे pointer वापरत गेले कि एव्हाना गुंतागुंत झालेली असते.  त्या नंतर भरीस भर म्हणून structure pointer, string pointer हे वेगवेगळे शब्द कानावर पडतात. शेवटी file pointer म्हणजे आता बस्स…! अशी अवस्था होते व या सगळ्या धामधुमीत function pointer दुर्लक्षीला जातो तो कायमचाच.

function pointer

function pointer

आता आपल्याला हे माहीत आहे कि प्रोग्रॅम लिहून, कंपाइल व रन करतांना मेन मेमरीमध्येच म्हणजेच Data Segment variables व Code Segment मध्ये compiled व executable code ठेवला जातो. म्हणजेच variables साठी जशी मेमरी दिली जाते त्या प्रमाणे functions साठी सुद्धा memory block दिले जातात. आणी मेमरी आली म्हणजे त्याचा address हा आलाच.

आता या फंक्शनचा address स्टोअर करायला अर्थातच pointer लागणार व त्यालाच function pointer म्हणतात. आणी हे function pointer declare करण्याचे प्रकरणच जरा confusing असल्यासारखे आहे. पण तेच तर मी सोप्या पद्धतीने सांगणार आहे. समजा आपण एक छोटासा प्रोग्रॅम लिहीला. जसे की

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

printmessage( );
printf(“Address of function = %un”,printmessage);
return 0;

}

void printmessage( )
{

printf(“In function printmessagen”);

}

या ठिकाणी main function मधील printf function मध्ये printmessage असे argument आहे. आपणच लिहीलेल्या user defined function चे फक्त नाव लिहीले आहे. हा प्रोग्रॅम कंपाइल व रन केला तर तुम्हाला जे output मिळते ते म्हणजे printmessage या फंक्शनचा तो memory मधील address असतो. Array चे नाव म्हणजे array च्या पहील्या element चा address असतो त्या प्रमाणेच printmessage या function च्या नावामध्ये function चा address असतो. त्याच प्रमाणे तुम्ही main function चा address सुद्धा print करू शकता.

आता आपण अजून एक साधा प्रोग्रॅम लिहू व त्या नंतर पाहूया हे function pointer काय प्रकरणं आहे ते…

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

int x;
static int y;
int *ptr;
void (*ptr_to_display)();

ptr_to_display = display;

(*ptr_to_display)( );

ptr = (int*) malloc(sizeof(int));
printf(“Address of x = %un”,&x);
printf(“Address of y = %un”,&y);
printf(“memory given by ptr = %un”,ptr);
printf(“Address of display function = %un”,display);
printf(“Address of main function = %un”,main);
printf(“Address of printf function = %un”,printf);
printf(“Address of scanf function = %un”,scanf);
free(ptr);

}
void display()
{

printf(“In display functionn”);

}

हा प्रोग्रॅम तुम्ही compile व रन केला तर तुम्हाला

  • x या auto variable चा stack वरील
  • y या static variable चा static memory वरील
  • ptr ला dynamic memory allocation ने केलेल्या heap वरील memory चा addresses मिळतील
  • तसेच तुम्हाला printf, scanf, main या library functions चे आणी display या user defined functions चे memory addresses मिळतील.

या ठिकाणी void (*ptr_to_display) ( ); असे एक declaration केले आहे ते function pointer चे declaration आहे व हेच confusing आहे. म्हणून आपण त्याचे dissection करूया.

  1. आपल्याला display या फंक्शनचा address store करायचा आहे व त्याचा return type void आहे म्हणून आपण एक फंक्शन पॉइंटर declaration void असे सुरू केले आहे.
  2. इतर pointer variable ला नाव असते त्याप्रमाणे या variable चे नाव ptr_to_display असे आहे
  3. ते pointer variable असल्यामुळे त्याच्या मागे * जोडला आहे.
  4. आता या *ptr_to_display च्या दोनही बाजूला round brackets आहेत व त्यामुळेच compiler ला हा function pointer आहे असे कळते. व हाच सर्वात कळीचा मुद्दा आहे कारण जर round brackets टाकले नाहीत तर मात्र declaration void *ptr_to_display असे होइल व त्याचा अर्थ ptr_to_display हा void pointer आहे असा होतो.
  5. त्या नंतर pair of round brackets आहेत ते म्हणजे  ज्या function चा pointer करायचा त्या function च्या arguments साठी असते. या ठिकाणी display function arguments घेत नसल्यामुळे brackets empty आहेत.

आता हे वरील स्टेटमेंट एकाच वाक्यात सांगायचे असेल तर “ptr_to_display हा no arguments घेणाऱ्या व void return करणाऱ्या  function चा pointer आहे” असे सांगता येइल.

त्यामुळेच ptr_to_display = display; या assignment स्टेटमेंट मुळे display function चा address ptr_to_display या function pointer मध्ये store होइल.

pointer indirection operator वापरुन जसे pointer ज्या ठिकाणी point करत आहे त्या ठिकाणचे contents access करता येतात त्याच प्रमाणे आपण function pointer वापरुन function ची मेमरी access करणे किंवा function call करण्याची प्रक्रिया सुद्धा करता येते. जसे की…

त्या पुढील स्टेटमेंट म्हणजेच (*ptr_to_display) ( ); actually display function call करण्याचे काम करेल. अर्थात तुम्ही ptr_to_display( ); असे लिहीले तरी सुद्धा display function invoke होतेच.

इतके उद्योग करून याचा उपयोग काय असा प्रश्न साहजीकच पडतो. पण मेमरी बरोबर खेळणे हीच तर C language ची खासीयत आहे. त्यामुळे resident memory programs लिहीण्यासाठी, virus लिहीण्यासाठी, आणी anti-virus लिहीण्यासाठी function pointer चा सर्रास वापर केला जातो.  

Heart of C

See on Scoop.itC Programming Language

First question asked about C Marathi to us by everybody in all educational institutes and by all professionals is How we have covered Pointers…! Our answer is “ये तो हमारे बायें हाथ का…

C Marathi‘s insight:

Innovative e-learning contents of Programming language developed by C Marathi team

See on www.cmarathionline.com

Tokens in C

C language चा प्रोग्रॅम लिहील्या नंतर कंपाइल केल्यानंतर एरर मिळाल्या नाहीत तर होणारा आनंद रन होणाऱ्या आनंदापेक्षा मोठ्ठा असतो.

C Programming language शिकायला सुरवात केल्यानंतर पहील्या काही आठवडयात Data Types, if-else, loops, functions संपते. याच काळामध्ये मात्र पहील्या चॅप्टर मधील Tokens हा प्रकार शिकुन सुद्धा न शिकलेल्या प्रमाणे अवस्था होते. असा काहीतरी शब्द कानावर पडला होता असे तर आठवते किंवा या शब्दाबद्द्ल माहीतच नसते. नंतर Java शिकतांना त्याचे महत्व कळते.  म्हणून हि खास पोस्ट…!

Tokens

program ज्यावेळी कंपायलरला पाठवला जातो त्यावेळी पुर्ण प्रोग्रॅम line-by-line… word-by-word… आणी त्याही पेक्षा character-by-character पद्धतीने compiler कडून वाचला जातो. असे करण्याच्या पद्धतीला Parsing असे म्हणतात. Compiler, Preprocessor, Linker, Loader, Interpreter प्रमाणे हे सुद्धा एक System Software असते. याच आधारे प्रोग्रॅमचा सिंटॅक्स language च्या rules प्रमाणे आहे कि नाही हे तपासले जाते. आता हे सर्व जे काही तपासले जाते त्या सर्व सेट ला Tokens असे म्हणतात.

C language मध्ये एकंदरीत 6 वेगवेगळ्या प्रकारची Tokens उपलब्ध आहेत.

  1. keyword e.g. int, if, return, default are kind of tokens
  2. identifier e.g. main, total, sum are kind of tokens
  3. constant e.g. 234, 4.5, ‘R’ are kind of tokens
  4. string literal e.g. “C Marathi”, “Enter Number” are kind of tokens
  5. operator e.g. +, *, &&, % are kind of tokens
  6. punctuator e.g. [ ], ( ), { } are kind of tokens

Tokens are separated by white space character; a category which includes space, tab, linefeed, carriage return and new line character.

मला वाटतं आता तुम्हाला interview मध्ये “tokens म्हणजे काय?” असं विचारल तर सांगता येइल…!

तुम्हाला हे सर्व वाचून कळाल्या नंतर हे सर्व व्हिडीओ पहाण्यास विसरू नका. 1, 2, 3, 4, 5, 6, 7

Logical ! (NOT) operator in C

See on Scoop.itC Programming Language

“माझ तुझ्यावर प्रेम नाही असं नाही…!” काय अर्थ आहे हो या वाक्याचा समजायला सोपा पण वापरायला अवघड असा हा logical operator. पण अवघड म्हणजे syntax अवघड नाही तर कोणत्या situation ला नेमक…

http://www.cmarathionline.com/logical-not-operator-in-c/

C Marathi‘s insight:

Innovative methodology to learn programming language in Marathi

See on www.cmarathionline.com