I tried to code it like such (incorrectly):
int f(int *arr, int n) { int i; arr = malloc( n * sizeof (*arr)); for (i = 0; i < n; ++i, ++arr) { *arr = i; } arr -= i; printf("Second element (from function) : %d\n", *(arr + 1)); return 0; } int main() { int *arr; f(arr, 5); printf("Second element (from caller) : %d", *(arr + 1)); free(arr); return 0; }
This is the output:
Second element (from function) : 1 Second element (from caller) : 1032044593
As you can see from the above output, the correct element is displayed when accessing the array from the function, but when I try to access the array from outside of the function (after it has been malloced and data was added), the value displayed seemed like a value from an unmalloced address!
What was I doing wrong?
The problem with the above code is that I am passing the pointer to an int by value to the function; ie a copy of the pointer. That is why when I changed its address, the change was only visible from inside the function.The Correct Way
The correct way to do it is to pass a pointer to the pointer to int (int **arr) to the function, like such:int f(int **arr, int n) { //arr is now a pointer to a pointer to int int i; int *temp = malloc(n * sizeof **arr); //declare and malloc temporary space for (i = 0; i < n; ++i, ++temp) { *temp = i; } temp -= i; *arr = temp; //Assign the value of the inputted location to the temporary one created earlier on printf("Second element (from function) : %d\n", *(temp + 1)); return 0; } int main() { int *arr; f(&arr, 5); //The address of the pointer is now passed, not the pointer itself printf("Second element (from caller) : %d", *(arr + 1)); free(arr); return; }
Now the output from the above function is correct:
Second element (from function) : 1 Second element (from caller) : 1