Modification of a variable by a function requires that it be passed by
reference
Remember that when we wanted to modify an integer variable, we passed the
address of that variable into a function and the type of the function's
parameter that accepts it is int*, or a pointer to an int.
Similarly if we want to modify a variable which is a pointer to an int, we will pass the address of the variable into the function and the type of the function's parameter that accepts it will be int**, or a pointer to a pointer to int.
/********************************* ** File malloc2.c ** Author: S. Bogar ** Date: 1/3/95 ** Modified: 9/26/05 ** Section: 101 ** E-Mail: bogar@cs.umbc.edu ** ** This file demonstrates passing a pointer ** by reference to a function ** A pointer to a pointer *******************************/ #include <stdio.h> #include <stdlib.h> /* function prototype */ void GetMemory (int count, int **arrayPtr); int main() { int i, *values, nrElements ; int powerOf2 ; printf("Enter number of elements in integer values: ") ; scanf("%d", &nrElements) ; /* get a block of memory for 'nrElements' integers ** since 'values' is a pointer to int ** '&values' is the address of (pointer to) a pointer ** to int so that 'values' can be modified in the ** function */ GetMemory (nrElements, &values); /* Lets use the memory as an arrray */ powerOf2 = 1 ; for (i = 0; i < nrElements; i++) { values[i] = powerOf2 ; powerOf2 = 2 * powerOf2 ; } /* Print out contents of the array */ for (i = 0; i < nrElements; i++) { printf("values[%d] = %d\n", i, values[i]) ; } /* Give up use of the memory block */ free(values) ; return 0; } /*************** ** Function: GetMemory ** ** GetMemory() gets the memory space needed and modifies the pointer ** that will point to it in the calling function using call by reference ** ** Inputs: Number of integers for which to allocate ** space ** Pointer to the pointer that will point to ** the memory ** Output: The pointer to the memory is set by this function ** there is no return value ********************************/ void GetMemory (int count, int **arrayPtr) { /* malloc the memory and set the caller's pointer ** to point to it */ *arrayPtr = (int *) malloc( count * sizeof(int) ) ; if (*arrayPtr == NULL) { printf("Oops, we're out of memory\n") ; exit(-1); } }