c programming

Static and Dynamic Memory Allocation

Static Memory Allocation

Static Memory Allocation Compile-Time पर Variable के लिए Memory Reserve (Allocate) करने की Process है। C में, Static Variable को “static” Keyword का use करके Declare किया जाता है, जो Compiler को Program के पूरे Lifetime के दौरान Variable के लिए Memory Allocation करने का Instructs देता है। Static Variable के लिए Memory को एक Special Region में Allocate किया जाता है, जिसे Program की Memory के “Data Segment” के रूप में जाना जाता है।

Static Memory Allocation में जब भी Program Execute होता है| तो वह उस Size को Fix कर देता है, जो Program Use करने वाला है, और इसे आगे Change नहीं किया जा सकता है। Memory Allocation और Deallocation Compiler द्वारा Automatically रूप से किया जाता है।। जब Memory Allocation, Compiler Time (या) Run Time से पहले किया जाता है, तो इसे Static Memory Allocation कहा जाता है।

Key Features

  • Memory Allocation और Deallocation Compiler द्वारा किया जाता है।
  • यह Static Memory Allocation के लिए Stack Data Structures का use करता है।
  • Variables Permanently रूप से Allocated किए जाते हैं।
  • Execution, Dynamic Memory Allocation से Fast होता है।
  • Memory Runtime से पहले Allocate की जाती है।

Example


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

int main()
{
int size;
printf(“Enter limit of the text: \n”);
scanf(“%d”, &size);
char str[size];
printf(“Enter some text: \n”);
scanf(” “);
gets(str);
printf(“Inputted text is: %s\n”, str);
return 0;
}

Output


Enter limit of the text:

Enter some text:

Inputted text is:

Advantages of Static Memory Allocation

  • Faster Access: Static Memory Allocation का  Access Time Fast होता है, क्योंकि Memory Compile-Time के दौरान Reserved होती है, जोकि Runtime Overhead से Prevent करती है।
  • Persistent Values: Variable Function Call में अपने Value बनाए रखते हैं, जिससे यह Multiple Call में State Maitain रखने के लिए use हो जाता है।

Disadvantages of Static Memory Allocation

  • Limited Flexibility: Static Variable के लिए Memory का Size Compile-Time पर Fix किया जाता है| और Runtime के दौरान इसे Change नहीं जा सकता है, यदि कुशलतापूर्वक उपयोग नहीं किया जाता है, तो संभावित रूप से Memory Wastage हो सकती है।
  • Not Thread-Safe: Shared Memory Access के कारण Static Variable, Multi-Threaded Environment में Issues Generate कर सकते हैं।

Dynamic Memory Allocation

Dynamic Memory Allocation, Program को Runtime के दौरान Memory Allocate करने की Permission देता है| जो Specialy तब use होता है, जब Memory Requirement, Unknown होती हैं| C Programming, Dynamic Memory Management के लिए Malloc, Calloc, Realloc और (stdlib.h) Library से Built-in Function Provide करता है।

Dynamic Memory Allocation में Size का Initialization और Allocation, Programmer द्वारा किया जाता है। यह Pointers के साथ Manage और Serve किया जाता है, जो उस Area में नए Allocated Memory Space को Point करता है| जिसे Heap कहते हैं। Heap Memory, Unorganized होती है, और इसे एक Resource के रूप में माना जाता है| जब Memory Allocation, Run Time या Execution Time के दौरान किया जाता है, तो इसे Dynamic Memory Allocation के रूप में जाना जाता है।

Key Features

  • Requirement के अनुसार Memory Size को फिर से Allocate/Deallocate भी कर सकते हैं।
  • Dynamic Allocation, Run Time पर किया जाता है।
  • इसमें Memory का Wastage कम होता है|

Function used for Dynamic Memory Allocation

Stdlib.h Header File में कुछ Function उपलब्ध हैं, जिनका उपयोग Memory को Dynamic रूप से Allocate करने के लिए किया जाता है| जोकि निम्नलिखित है –

  • Malloc() Function
  • Calloc() Function
  • Realloc() Function

Malloc() Function

malloc () Function का use Program Execution के दौरान Dynamically Memory Allocate करने के लिए किया जाता है | malloc () Function की मदद से Allocate की गई Dynamically Memory में By Default Garbage Value Stored होती है| जब malloc() Function Required Memory Allocate नहीं कर पता है, तब यह NULL Pointer Return करता है |

Syntax


ptr=(cast-type*)malloc(byte-size)

Example


#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, *ptr;
printf(“Enter number of elements: “);
scanf(“%d”,&n);

//memory allocated using malloc
ptr=(int*)malloc(n*sizeof(int));
if(ptr==NULL)
{
printf(“Sorry! unable to allocate memory”);
exit(0);
}
else
{
printf(“Memory successfully allocated using malloc.\n”);
printf(“Enter elements of array: “);
for(i=0;i<n;++i)
{
scanf(“%d”,ptr+i);
}

}
free(ptr);

return 0;
}

Output


Enter number of elements: 5
Memory successfully allocated using malloc
Enter elements of array:
10
20
30
40
50

Calloc() Function

calloc() Function के द्वारा Memory के Multiple Blocks, Dynamically Allocate कर सकते है | इसका use Array और Structure जैसे Complex Data Structures को Memory Allocate करने के लिए किया जाता है | यह malloc() Function की ही तरह Dynamically Memory Allocate करता है, मगर calloc() का use Memory Space की Multiple Block Allocate करने के लिए किया जाता है, और malloc() का use Memory Space का Signal Block Allocate करने के लिए किया जाता है |

malloc() function के द्वारा Created Dynamically Memory में By Default Garbage Value है, जबकि calloc() के द्वारा Created Dynamically Memory में By Default शून्य Initialize होता है | यदि calloc() Function की मदद से Dynamic Memory Allocate करते समय Memory में पर्याप्त Space न हो तो यह Null Return करता है |

Syntax


ptr = (cast-type*)calloc(n, element-size);

Example


#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, i, *ptr;
printf(“Enter number of elements: “);
scanf(“%d”,&n);

//memory allocated using calloc
ptr=(int*)calloc(n,sizeof(int));
if(ptr==NULL)
{
printf(“Sorry! unable to allocate memory”);
exit(0);
}
else
{
printf(“Memory successfully allocated using calloc.\n”);
}
free(ptr);
return 0;
}

Output


Enter number of elements: 5
Memory successfully allocated using calloc

realloc() function

malloc() or calloc() के द्वारा Created Dynamically Memory के Size को बदलने के लिए realloc() का use किया जाता है | realloc() Function के द्वारा आसानी से Dynamically Memory के size में बदलाव कर सकते है |

Syntax


ptr=realloc(ptr, new-size);

Example


#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,n,m,*ptr;

printf(“Enter Number of Elements : “);
scanf(“%d”,&n);

ptr=(int *)malloc(n*sizeof(int));

for(i=0;i<n;i++)
{
printf(“Enter Element : “);
scanf(“%d”,ptr+i);
}

printf(“Enter Number of Elements : “);
scanf(“%d”,&m);

ptr=(int *)realloc(ptr,m*sizeof(int));

for(i=n;i<m;i++)
{
printf(“Enter Element : “);
scanf(“%d”,ptr+i);
}

printf(“All Elements : “);
for(i=0;i<m;i++)
{
printf(“%d “,*(ptr+i));
}

free(ptr);

return 0;
}

Output


Enter Number of Elements : 3
Enter Element : 12
Enter Element : 34
Enter Element : 54
Enter Number of Elements : 5
Enter Element : 76
Enter Element : 22
All Elements : 12 34 54 76 22

Advantages of Dynamic Memory Allocation

  • Flexible Memory Usage: Runtime के दौरान आवश्यकतानुसार Memory Allocate की जाती है, जिससे Efficient रूप Usage करने की Permission मिलती है, और Wastages Reduce होता है।
  • Scalability: Dynamic Memory Allocation Linked Lists, Trees और Dynamic Arrays जैसी Data Structures के Build करने की सुविधा Provide करता है।
  • Better Thread Safety: चूंकि प्रत्येक Thread की अपनी Dynamically रूप से Allocated Memory हो सकती है, यह Multi-Threaded Environment में Data Corruption की संभावना को कम कर देता है।

Disadvantages of Dynamic Memory Allocation

  • Slower Access: Dynamic Memory Allocation में Runtime Overhead शामिल होता है, जो इसे Static Memory Allocation की तुलना में Slow बनाता है।
  • Potential Memory Leaks: यदि Free Space का use करके Memory को ठीक से Allocate नहीं किया जाता है, तो इससे Memory Leaks हो सकती है| और Program समय के साथ अत्यधिक Memory Consume कर सकता है।
Tags: No tags

Add a Comment

Your email address will not be published. Required fields are marked *