7-9. Dynamic Array and DMA-1
7-9. Dynamic Array and DMA-1
Assignment
quiz
Mid term examination –
II
End term Examination
Dynamic Memory
Allocation
3
Problem with Arrays
◼ Sometimes
Amount of data cannot be predicted beforehand
Number of data items keeps changing during program
execution
◼ Example: Serach for an element in an array of N elements
◼ One solution: find the maximum possible value of N and
allocate an array of N elements
Wasteful of memory space, as N may be much smaller
in some executions
Example: maximum value of N may be 10,000, but a
particular run may need to search only among 100
elements
◼ Using array of size 10,000 always wastes memory
in most cases 4
Dynamic Array
top = 4
6 1 7 8
0 1 2 3 4 5
Dynamic Array
top = 4 insert 5
6 1 7 8
0 1 2 3 4 5
Dynamic Array
top = 5
6 1 7 8 5
0 1 2 3 4 5
Dynamic Array
top = 5
insert 2
6 1 7 8 5
0 1 2 3 4 5
Dynamic Array
top = 6
insert 3
6 1 7 8 5 2
0 1 2 3 4 5
Dynamic Array
top = 6
insert 3
top = 6
insert 3
6 1 7 8 5 2
0 1 2 3 4 5 So we will create a
new, bigger array …
Dynamic Array
top = 6
insert 3
6 1 7 8 5 2
0 1 2 3 4 5 So we will create a
new, bigger array …
0 1 2 3 4 5 6 7 8 9 10 11
Dynamic Array
top = 6
insert 3
6 1 7 8 5 2
0 1 2 3 4 5 … copy the
elements of the old
array into it …
0 1 2 3 4 5 6 7 8 9 10 11
Dynamic Array
insert 3
6 1 7 8 5 2
0 1 2 3 4 5 … copy the
elements of the old
top = 6
array into it …
6 1 7 8 5 2
0 1 2 3 4 5 6 7 8 9 10 11
Dynamic Array
insert 3
6 1 7 8 5 2
0 1 2 3 4 5 … and finally insert
top = 7 3 into the new array.
6 1 7 8 5 2 3
0 1 2 3 4 5 6 7 8 9 10 11
Dynamic Array
Frees previously
allocated space
6 1 7 8 5 2
0 1 2 3 4 5
top = 7
6 1 7 8 5 2 3
0 1 2 3 4 5 6 7 8 9 10 11
Better Solution
◼ Dynamic memory allocation
Know how much memory is needed after the program
is run
◼ Example: ask the user to enter from keyboard
Dynamically allocate only the amount of memory
needed
◼ C provides functions to dynamically allocate
memory
malloc, calloc, realloc
17
18
Memory Allocation Functions
◼ malloc
Allocates requested number of bytes and returns a
pointer to the first byte of the allocated space
◼ calloc
Allocates space for an array of elements, initializes
them to zero and then returns a pointer to the
memory.
◼ free
Frees previously allocated space.
◼ realloc
Modifies the size of previously allocated space.
◼ We will only do malloc and free
19
20
If space is insufficient, allocation fails and
returns a NULL pointer.
21
22
If space is insufficient, allocation fails and
returns a NULL pointer.
23
24
25
26
If space is insufficient, allocation fails and
returns a NULL pointer.
27
/*----------------------------------------------------
* Program example of creating dynamic array in C using malloc
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
//Creating the int pointer to store
//the address return by malloc
int *ptr=NULL;
29
Example
int main() printf("Input heights for %d
{ students \n",N);
int i,N; for (i=0; i<N; i++)
float *height; scanf ("%f", &height[i]);
float sum=0,avg;
for(i=0;i<N;i++)
printf("Input no. of students\n"); sum += height[i];
scanf("%d", &N);
avg = sum / (float) N;
height = (float *)
malloc(N * sizeof(float)); printf("Average height = %f \n",
avg);
free (height);
return 0;
}
30
Can we allocate only arrays?
◼ malloc can be used to allocate memory for
single variables also
p = (int *) malloc (sizeof(int));
Allocates space for a single int, which can be
accessed as *p
◼ Single variable allocations are just special
case of array allocations
Array with only one element
31
malloc( )-ing array of structures
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char name[20];
int roll;
float SGPA, CGPA;
} person;
void main()
{
person *student;
int i,j,n;
printf("Enter number of students");
scanf("%d", &n);
student = (person *)malloc(n*sizeof(person));
32
malloc( )-ing array of structures
for (i=0; i<n; i++)
{
printf("Enter name");
scanf("%s", student[i].name);
printf("Enter roll number");
scanf("%d", &student[i].roll);
printf("Enter SGPA");
scanf("%f", &student[i].SGPA);
}
33
Static array of pointers
#define N 20
#define M 10
int main()
{
char word[N], *w[M];
int i, n;
scanf("%d",&n);
for (i=0; i<n; ++i) {
scanf("%s", word);
w[i] = (char *) malloc ((strlen(word)+1)*sizeof(char));
strcpy (w[i], word) ;
}
for (i=0; i<n; i++) printf("w[%d] = %s \n",i,w[i]);
return 0;
}
34
Static array of pointers
#define N 20 Output
#define M 10 4
int main() Tendulkar
{ Sourav
char word[N], *w[M]; Khan
int i, n; India
scanf("%d",&n); w[0] = Tendulkar
for (i=0; i<n; ++i) { w[1] = Sourav
scanf("%s", word); w[2] = Khan
w[i] = (char *) malloc ((strlen(word)+1)*sizeof(char)); w[3] = India
strcpy (w[i], word) ;
}
for (i=0; i<n; i++) printf("w[%d] = %s \n",i,w[i]);
return 0;
}
35
How it will look like malloc()
w
0 T e n d u l k a r \0
1 S o u r a v \0
2 K h a n \0
3 I n d i a \0
36
Pointers to Pointers
◼ Pointers are also variables (storing addresses),
so they have a memory location, so they also
have an address
◼ Pointer to pointer – stores the address of a
pointer variable
p[0]
p int ** int *
p[1] int *
p[2] int *
38
2D array
#include <stdlib.h>
int main()
{
int **array;
array = (int**) malloc(nrows * sizeof(int *));
{
39
2D array
x 0
Int main()
{ 1
2
*x; pointer to x[0][0]
3
*(x+1); pointer to x[1][0]
40
Dynamic Allocation of 2-d Arrays
int **allocate (int h, int w)
{ void read_data (int **p, int h, int w)
int **p; Allocate array {
int i, j; of pointers int i, j;
for (i=0;i<h;i++)
p = (int **) malloc(h*sizeof (int *) ); for (j=0;j<w;j++)
for (i=0;i<h;i++) scanf ("%d", &p[i][j]);
p[i] = (int *) malloc(w * sizeof (int)); }
return(p);
} Allocate array of Elements accessed
integers for each like 2-D array elements.
row
41
Contd.
void print_data (int **p, int h, int w) int main()
{ {
int i, j; int **p;
for (i=0;i<h;i++) int M, N;
{ printf ("Give M and N \n");
for (j=0;j<w;j++) scanf ("%d%d", &M, &N);
printf ("%5d ", p[i][j]); p = allocate (M, N);
printf ("\n"); read_data (p, M, N);
} printf ("\nThe array read as \n");
} print_data (p, M, N);
return 0;
}
42
Contd. int main()
{
void print_data (int **p, int h, int w)
int **p;
{
int M, N;
int i, j;
printf ("Give M and N \n");
for (i=0;i<h;i++)
scanf ("%d%d", &M, &N);
{
p = allocate (M, N);
for (j=0;j<w;j++)
read_data (p, M, N);
printf ("%5d ", p[i][j]);
printf ("\nThe array read as \n");
printf ("\n");
print_data (p, M, N);
} Give M and N
return 0;
} 33
123 }
456
789
The array read as
1 2 3
4 5 6
7 8 9 43