110 likes | 241 Vues
This guide explains the use of the `sizeof` operator in C to determine the memory size of data types, structures, and arrays. Discover how the `malloc`, `calloc`, and `free` functions from the `stdlib.h` library manage dynamic memory allocation and deallocation. Learn the differences between static and dynamic memory, including how static arrays are defined at compile time while dynamic arrays are managed at runtime. This knowledge is essential for handling data structures like linked lists and trees, which require dynamic memory management.
E N D
Memory allocation CSE 2451 Matt Boggus
sizeof • Thesizeofunary operatorwill return the number of bytes reserved for a variable or data type. • Determine: • Returning the byte length of a data type • Number of bytes reserved for a structure (user defined type) • Byte length of an array
Returning the length of a data type /* How big is an int? Most machines size ints as 4 bytes */ main() { printf("%d \n", sizeof(int)); }
Number of bytes reserved for a structure /* On most machines a struct with two ints is the same size as two ints:8 */ main(){ struct { inta; intb; } TwoInts; printf("%d \n", sizeof(TwoInts)); }
Length of an array main() { char String[20]; printf("%d \n", sizeof String); printf("%d \n", sizeof(String)); } /* As a unary operator and not a function, parenthesis are not necessary (if the argument is a variable), but aid readability */
Dynamic memory functions • In the stdlib.h library: • malloc() • Allocate a memory block • free() • De-allocate memory • calloc() • Allocate space for an array • realloc() • Change the size of previously allocated memory • Each function is used to initialize a pointer with memory from free store (a section of memory available to all programs)
malloc • The function malloc() will allocate a block of memory that is size bytes large. If the requested memory can be allocated a pointer is returned to the beginning of the memory block. • Note: the content of the received block of memory is not initialized. • malloc() prototype: • void * malloc ( size_t size ); • Parameters: • Size of the memory block in bytes. • Return value: • If the request is successful then a pointer to the memory block is returned. • If the function failed to allocate the requested block of memory, a null pointer is returned. • Example • http://www.codingunit.com/c-reference-stdlib-h-function-malloc
malloc usage int*ptr = (int*) malloc( sizeof (int) ); int*ptr = (int*) malloc( sizeof (*ptr) );
calloc • calloc() prototype: • void * calloc ( size_tnum, size_t size ); • Parameters: • Number of elements (array) to allocate and the size of elements. • Return value: • Will return a pointer to the memory block. If the request fails, a NULL pointer is returned. • Example: • http://www.codingunit.com/c-reference-stdlib-h-function-calloc
Static vs. Dynamic memory • Static arrays – size defined at compile time • Memory stored on the stack • Stack grows when entering new blocks (branches, loops, functions) • Stack shrinks when leaving blocks • Obeys scoping rules • Dynamic array – size defined at run time • Memory stored on the heap • Stays available until removed • In C – manually with function calls • In Java – automatically with garbage collection • Why have dynamic memory? • Input of unknown size • Data structures that require dynamic memory allocation • Linked lists, trees, etc.
free • The free function deallocates memory • free( ptr); • Frees the memory of whatever ptr is pointing at • After freeing a pointer, it is a good idea to set it to point to 0 • This makes it a null pointer • Invalid dereferencing is easier to spot with NULL pointers • (Some compilers support explicitly setting a pointer to NULL)