Malloc int Triple pointer
In this section, you are going to learn
How to allocate memory using malloc ?
How to allocate memory using calloc ?
How to allocate memory using realloc ?
Key point to remember
Triple pointer points to array of double pointers
Double pointer points to array of single pointers
Single pointer points to array of integers
Example is arr[2][3][4]
Now let us take a look at real time examples
Step 1 : Include stdlib.h
#include <stdlib.h>
Step 2 : Define Triple Pointer
int ***ptr;
Step 3.1 :
ptr
is a triple pointer and points to array of double pointers
ptr = malloc(sizeof(int **));
Step 3.2 :
*ptr
is a double pointer and points to array of single pointers
*ptr = malloc(sizeof(int *));
Step 3.3 :
**ptr
is a single pointer and points to array of integers
**ptr = malloc(sizeof(int));
Step 4 : Assign a value to integer
***ptr = 65;
Step 5 : Print the value of integer
printf("***ptr = %d\n", ***ptr);
Step 6.1 : Free array of integers
free(**ptr);
Step 6.2 : Free array of single pointers
free(*ptr);
Step 6.3 : Free array of double pointers
free(ptr);
See the full program below
1#include <stdio.h>
2
3// Step 1 : Include stdlib.h
4#include <stdlib.h>
5
6int main(void)
7{
8 // Step 2 : Define Triple Pointer
9 int ***ptr;
10
11 // Step 3.1 : ptr is a triple pointer and points to array of double pointers
12 ptr = malloc(sizeof(int **));
13
14 // Step 3.2 : *ptr is a double pointer and points to array of single pointers
15 *ptr = malloc(sizeof(int *));
16
17 // Step 3.3 : **ptr is a single pointer and points to array of integers
18 **ptr = malloc(sizeof(int));
19
20 // Step 4 : Assign a value to integer
21 ***ptr = 65;
22
23 // Step 5 : Print the value of integer
24 printf("***ptr = %d\n", ***ptr);
25
26 // Step 6.1 : Free array of integers
27 free(**ptr);
28
29 // Step 6.2 : Free array of single pointers
30 free(*ptr);
31
32 // Step 6.3 : Free array of double pointers
33 free(ptr);
34
35 return 0;
36}
Statement |
Description |
---|---|
ptr |
|
*ptr |
|
**ptr |
|
***ptr |
|
sizeof(ptr) |
|
sizeof(*ptr) |
|
sizeof(**ptr) |
|
sizeof(***ptr) |
|
ptr = malloc( sizeof(int **) ) |
|
*ptr = malloc( sizeof(int *) ) |
|
**ptr = malloc( sizeof(int ) ) |
|
Step 1 : Include stdlib.h
#include <stdlib.h>
Step 2 : Define Triple Pointer
int ***ptr;
Step 3.1 :
ptr
is a triple pointer and points to array of double pointers
ptr = malloc(sizeof(int **));
Step 3.2 :
*ptr
is a double pointer and points to array of single pointers
*ptr = malloc(sizeof(int *));
Step 3.3 :
**ptr
is a single pointer and points to array of integers
**ptr = malloc(10 * sizeof(int));
Step 4 :
**ptr
is now pointing to array of 10 integers. Hence can use it for integer memcpy operations
int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memcpy(**ptr, i_arr, sizeof(i_arr));
Step 5 : Print the array
for (int i = 0; i < 10; i++) {
printf("%d\n", (**ptr)[i]);
}
OR
for (int i = 0; i < 10; i++) {
printf("%d\n", ptr[0][0][i]);
}
Step 6.1 : Free array of integers
free(**ptr);
Step 6.2 : Free array of single pointers
free(*ptr);
Step 6.3 : Free array of double pointers
free(ptr);
See the full program below
1#include <stdio.h>
2#include <string.h>
3
4// Step 1 : Include stdlib.h
5#include <stdlib.h>
6
7int main(void)
8{
9 // Step 2 : Define Triple Pointer
10 int ***ptr;
11
12 // Step 3.1 : ptr is a triple pointer and points to array of double pointers
13 ptr = malloc(sizeof(int **));
14
15 // Step 3.2 : *ptr is a double pointer and points to array of single pointers
16 *ptr = malloc(sizeof(int *));
17
18 // Step 3.3 : **ptr is a single pointer and points to array of integers
19 **ptr = malloc(10 * sizeof(int));
20
21 // Step 4 : **ptr is now pointing to array of 10 integers. Hence can use it for integer memcpy operations
22 int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
23 memcpy(**ptr, i_arr, sizeof(i_arr));
24
25 // Step 5 : Print the Integers
26 for (int i = 0; i < 10; i++)
27 {
28 printf("(**ptr)[i] = %d\n", (**ptr)[i]);
29 }
30
31 for (int i = 0; i < 10; i++)
32 {
33 printf("ptr[0][0][i] = %d\n", ptr[0][0][i]);
34 }
35
36 // Step 6.1 : Free array of integers
37 free(**ptr);
38
39 // Step 6.2 : Free array of single pointers
40 free(*ptr);
41
42 // Step 6.3 : Free array of double pointers
43 free(ptr);
44
45 return 0;
46}
Statement |
Description |
---|---|
ptr |
|
*ptr |
|
**ptr |
|
***ptr |
|
sizeof(ptr) |
|
sizeof(*ptr) |
|
sizeof(**ptr) |
|
sizeof(***ptr) |
|
ptr = malloc( sizeof(int **) ) |
|
*ptr = malloc( sizeof(int *) ) |
|
**ptr = malloc( 10 * sizeof(int ) ) |
|
memcpy(**ptr, i_arr, sizeof(i_arr)); |
|
(**ptr)[i] |
|
ptr[0][0][i] |
|
Step 1 : Include stdlib.h
#include <stdlib.h>
Step 2 : Define Triple Pointer
int ***ptr;
Step 3.1 : ptr is a triple pointer and points to array of double pointers
ptr = malloc(sizeof(int **));
Step 3.2 : Create array of single pointers from
(*ptr)[0]
…(*ptr)[9]
*ptr = malloc(10 * sizeof(int *));
Step 3.3 : Now create array of integers for every single pointer from
(*ptr)[0]
…(*ptr)[9]
for (int i = 0; i < 10; i++) {
(*ptr)[i] = malloc(10 * sizeof(int));
}
Step 4 :
(*ptr)[0]
..(*ptr)[9]
is now pointing to array of integers each
for (int i = 0; i < 10; i++) {
int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memcpy((*ptr)[i], i_arr, sizeof(i_arr));
}
Step 5 : Print the Integer arrays
for (int i = 0; i < 1; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
printf("ptr[%d][%d][%d] = %d\n", i, j, k, ptr[i][j][k]);
}
}
}
Step 6.1 : Free array of integers pointed by all single pointers
for (int i = 0; i < 10; i++) {
free((*ptr)[i]);
}
Step 6.2 : Free array of single pointers
free(*ptr);
Step 6.3 : Free array of double pointers
free(ptr);
See the full program below
1#include <stdio.h>
2#include <string.h>
3
4// Step 1 : Include stdlib.h
5#include <stdlib.h>
6
7int main(void)
8{
9 // Step 2 : Define Triple Pointer
10 int ***ptr;
11
12 // Step 3.1 : ptr is a triple pointer and points to array of double pointers
13 ptr = malloc(sizeof(int **));
14
15 // Step 3.2
16 // *ptr is a double pointer and points to array of single pointers
17 // Create array of single pointers from (*ptr)[0] ... (*ptr)[9]
18 *ptr = malloc(10 * sizeof(int *));
19
20 // Step 3.3 : Now create array of integers for every single pointer from (*ptr)[0] ... (*ptr)[9]
21
22 for (int i = 0; i < 10; i++) {
23 (*ptr)[i] = malloc(10 * sizeof(int));
24 }
25
26 // Step 4 : (*ptr)[0] .. (*ptr)[9] is now pointing to array of integers each
27 for (int i = 0; i < 10; i++) {
28 int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
29 memcpy((*ptr)[i], i_arr, sizeof(i_arr));
30 }
31
32 // Step 5 : Print the Integers
33 for (int i = 0; i < 1; i++) {
34 for (int j = 0; j < 10; j++) {
35 for (int k = 0; k < 10; k++) {
36 printf("ptr[%d][%d][%d] = %d\n", i, j, k, ptr[i][j][k]);
37 }
38 }
39 }
40
41 // Step 6.1 : Free array of integers pointed by all single pointers
42 for (int i = 0; i < 10; i++) {
43 free((*ptr)[i]);
44 }
45
46 // Step 6.2 : Free array of single pointers
47 free(*ptr);
48
49 // Step 6.3 : Free array of double pointers
50 free(ptr);
51
52 return 0;
53}
Step 1 : Include stdlib.h
#include <stdlib.h>
Step 2 : Define Triple Pointer
int ***ptr;
Step 3.1 : Create array of double pointers from ptr[0] … ptr[9]
ptr = malloc(10 * sizeof(int **));
Step 3.2 : Create array of single pointers for every double pointer
for (int i = 0; i < 10; i++) {
ptr[i] = malloc(10 * sizeof(int *));
}
Step 3.3 : Create array of integers for every single pointer from ptr[0][9] … ptr[9][9]
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
ptr[i][j] = malloc(10 * sizeof(int));
}
}
Step 4 : Use ptr[0][0] … ptr[9][9] as integer array
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memcpy(ptr[i][j], i_arr, sizeof(i_arr));
}
}
Step 5 : Print the Integers
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
printf("ptr[%d][%d][%d] = %d\n", i, j, k, ptr[i][j][k]);
}
}
}
Step 6.1 : Free array of integers pointed by all single pointers
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
free(ptr[i][j]);
}
}
Step 6.2 : Free array of single pointers
for (int i = 0; i < 10; i++) {
free(ptr[i]);
}
Step 6.3 : Free array of double pointers
free(ptr);
See the full program below
1#include <stdio.h>
2#include <string.h>
3
4// Step 1 : Include stdlib.h
5#include <stdlib.h>
6
7int main(void)
8{
9 // Step 2 : Define Triple Pointer
10 int ***ptr;
11
12 // Step 3.1 : Create array of double pointers from ptr[0] ... ptr[9]
13 ptr = malloc(10 * sizeof(int **));
14
15 // Step 3.2 : Create array of single pointers for every double pointer
16 for (int i = 0; i < 10; i++) {
17 ptr[i] = malloc(10 * sizeof(int *));
18 }
19
20 // Step 3.3 : Create array of integers for every single pointer from ptr[0][9] ... ptr[9][9]
21 for (int i = 0; i < 10; i++) {
22 for (int j = 0; j < 10; j++) {
23 ptr[i][j] = malloc(10 * sizeof(int));
24 }
25 }
26
27 // Step 4 : Use ptr[0][0] ... ptr[9][9] as integer array
28 for (int i = 0; i < 10; i++) {
29 for (int j = 0; j < 10; j++) {
30 int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
31 memcpy(ptr[i][j], i_arr, sizeof(i_arr));
32 }
33 }
34
35 // Step 5 : Print the Integers
36 for (int i = 0; i < 10; i++) {
37 for (int j = 0; j < 10; j++) {
38 for (int k = 0; k < 10; k++) {
39 printf("ptr[%d][%d][%d] = %d\n", i, j, k, ptr[i][j][k]);
40 }
41 }
42 }
43
44 // Step 6.1 : Free array of integers pointed by all single pointers
45 for (int i = 0; i < 10; i++) {
46 for (int j = 0; j < 10; j++) {
47 free(ptr[i][j]);
48 }
49 }
50
51 // Step 6.2 : Free array of single pointers
52 for (int i = 0; i < 10; i++) {
53 free(ptr[i]);
54 }
55
56 // Step 6.3 : Free array of double pointers
57 free(ptr);
58
59 return 0;
60}
Step 1 : Include stdlib.h
#include <stdlib.h>
Step 2 : Define an allocation function
int get_memory(int ****fp)
{
return 0;
}
Step 3.1 : Create array of double pointers from
(*fp)[0]
…(*fp)[9]
int get_memory(int ****fp)
{
// Step 3.1 : Create array of double pointers from (*fp)[0] ... (*fp)[9]
*fp = malloc(10 * sizeof(int **));
return 0;
}
Step 3.2 : Create array of single pointers for every double pointer
int get_memory(int ****fp)
{
// Step 3.1 : Create array of double pointers from (*fp)[0] ... (*fp)[9]
*fp = malloc(10 * sizeof(int **));
// Step 3.2 : Create array of single pointers for every double pointer
for (int i = 0; i < 10; i++) {
(*fp)[i] = malloc(10 * sizeof(int *));
}
return 0;
}
Step 3.3 : Create array of integers for every single pointer from
(*fp)[0][9]
…(*fp)[9][9]
int get_memory(int ****fp)
{
// Step 3.1 : Create array of double pointers from (*fp)[0] ... (*fp)[9]
*fp = malloc(10 * sizeof(int **));
// Step 3.2 : Create array of single pointers for every double pointer
for (int i = 0; i < 10; i++) {
(*fp)[i] = malloc(10 * sizeof(int *));
}
// Step 3.3 : Create array of integers for every single pointer from (*fp)[0][9] ... (*fp)[9][9]
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
(*fp)[i][j] = malloc(10 * sizeof(int));
}
}
return 0;
}
Step 4 : Define Triple Pointer in caller
int ***tp;
Step 5 : Pass Triple pointer as reference
get_memory(&tp);
Step 6 : Use tp[0][0] … tp[9][9] as integer array
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
memcpy(tp[i][j], i_arr, sizeof(i_arr));
}
}
Step 7 : Print the Integers
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
for (int k = 0; k < 10; k++) {
printf("ptr[%d][%d][%d] = %d\n", i, j, k, ptr[i][j][k]);
}
}
}
Step 6.1 : Free array of integers pointed by all single pointers
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
free(tp[i][j]);
}
}
Step 6.2 : Free array of single pointers
for (int i = 0; i < 10; i++) {
free(tp[i]);
}
Step 6.3 : Free array of double pointers
free(tp);
See the full program below
1#include <stdio.h>
2#include <string.h>
3
4// Step 1 : Include stdlib.h
5#include <stdlib.h>
6
7int get_memory(int ****fp)
8{
9 // Step 3.1 : Create array of double pointers from (*fp)[0] ... (*fp)[9]
10 *fp = malloc(10 * sizeof(int **));
11
12 // Step 3.2 : Create array of single pointers for every double pointer
13 for (int i = 0; i < 10; i++) {
14 (*fp)[i] = malloc(10 * sizeof(int *));
15 }
16
17 // Step 3.3 : Create array of integers for every single pointer from (*fp)[0][9] ... (*fp)[9][9]
18 for (int i = 0; i < 10; i++) {
19 for (int j = 0; j < 10; j++) {
20 (*fp)[i][j] = malloc(10 * sizeof(int));
21 }
22 }
23
24 return 0;
25}
26
27int main(void)
28{
29 // Step 2 : Define Triple Pointer
30 int ***tp;
31
32 // Step 3 : Pass Triple pointer as reference
33 get_memory(&tp);
34
35 // Step 4 : Use tp[0][0] ... tp[9][9] as integer array
36 for (int i = 0; i < 10; i++) {
37 for (int j = 0; j < 10; j++) {
38 int i_arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
39 memcpy(tp[i][j], i_arr, sizeof(i_arr));
40 }
41 }
42
43 // Step 5 : Print the Integers
44 for (int i = 0; i < 10; i++) {
45 for (int j = 0; j < 10; j++) {
46 for (int k = 0; k < 10; k++) {
47 printf("tp[%d][%d][%d] = %d\n", i, j, k, tp[i][j][k]);
48 }
49 }
50 }
51
52 // Step 6.1 : Free array of integers pointed by all single pointers
53 for (int i = 0; i < 10; i++) {
54 for (int j = 0; j < 10; j++) {
55 free(tp[i][j]);
56 }
57 }
58
59 // Step 6.2 : Free array of single pointers
60 for (int i = 0; i < 10; i++) {
61 free(tp[i]);
62 }
63
64 // Step 6.3 : Free array of double pointers
65 free(tp);
66
67 return 0;
68}
Current Module
Previous Module
Next Module
Other Modules