Using free() on pointers of two dimensional array with multiple malloc()?
I have a function that allocates a two dimensional array within a function returning a pointer to the array. Creating the array requires an array of pointers each of which contains the address of a row of the two dimensional array.
How do I correctly free these two malloc()
calls outside of this function once I am done with this array?
int** allocateMatrix(int rows, int cols)
int* arr = malloc(rows*cols*sizeof(int));
int** matrix = malloc(rows*sizeof(int*));
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
The function is used like this:
int** 2d_arr = allocateMatrix(row,cols);
Thanks!
c function pointers multidimensional-array free
add a comment |
I have a function that allocates a two dimensional array within a function returning a pointer to the array. Creating the array requires an array of pointers each of which contains the address of a row of the two dimensional array.
How do I correctly free these two malloc()
calls outside of this function once I am done with this array?
int** allocateMatrix(int rows, int cols)
int* arr = malloc(rows*cols*sizeof(int));
int** matrix = malloc(rows*sizeof(int*));
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
The function is used like this:
int** 2d_arr = allocateMatrix(row,cols);
Thanks!
c function pointers multidimensional-array free
add a comment |
I have a function that allocates a two dimensional array within a function returning a pointer to the array. Creating the array requires an array of pointers each of which contains the address of a row of the two dimensional array.
How do I correctly free these two malloc()
calls outside of this function once I am done with this array?
int** allocateMatrix(int rows, int cols)
int* arr = malloc(rows*cols*sizeof(int));
int** matrix = malloc(rows*sizeof(int*));
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
The function is used like this:
int** 2d_arr = allocateMatrix(row,cols);
Thanks!
c function pointers multidimensional-array free
I have a function that allocates a two dimensional array within a function returning a pointer to the array. Creating the array requires an array of pointers each of which contains the address of a row of the two dimensional array.
How do I correctly free these two malloc()
calls outside of this function once I am done with this array?
int** allocateMatrix(int rows, int cols)
int* arr = malloc(rows*cols*sizeof(int));
int** matrix = malloc(rows*sizeof(int*));
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
The function is used like this:
int** 2d_arr = allocateMatrix(row,cols);
Thanks!
c function pointers multidimensional-array free
c function pointers multidimensional-array free
edited Nov 16 '18 at 4:36
Richard Chambers
10.1k24268
10.1k24268
asked Nov 15 '18 at 18:50
Tim WeissenfelsTim Weissenfels
149
149
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
You can only pass to free
what was received from malloc
. So the number of calls to free
must be the same as the number of calls to malloc
.
The first row of 2d_arr
, i.e. 2d_arr[0]
, contains &arr[0*cols]
== &arr[0]
== arr
. So you want to free that and matrix
itself:
free(2d_arr[0]);
free(2d_arr);
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
@TimWeissenfels Yes, since2d_arr
contains the same value asmatrix
, the effect is the same.
– dbush
Nov 15 '18 at 19:10
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
@TimWeissenfels You can only pass tofree
what was passed tomalloc
. So two of each.
– dbush
Nov 15 '18 at 19:20
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
|
show 1 more comment
This will work:
void freeMatrix( int **matrix )
free( matrix[ 0 ] );
free( matrix );
Because, for i == 0
, this code
matrix[i] = &(arr[i*cols]);
sets matrix[ 0 ]
to the address of arr[0]
, which is the same value returned from the first malloc
call:
int* arr = malloc(rows*cols*sizeof(int));
It's clearer if you write matrix allocation like
int** allocateMatrix(int rows, int cols)
int** matrix = malloc(rows*sizeof(int*));
matrix[ 0 ] = malloc(rows*cols*sizeof(int));
int i;
for(i=1; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Note the change in malloc()
order, the direct assignment to matrix[ 0 ]
, and the change in loop index to start at 1
.
add a comment |
I suggest that you use a single malloc()
to allocate the entire memory area so as to make it easier to manage as a single pointer.
I believe the following modified version of your function should work.
int** allocateMatrix(int rows, int cols)
size_t sMemSize = rows*sizeof(int*) + rows*cols*sizeof(int);
int** matrix = malloc(sMemSize);
int* arr = (int *) (matrix + rows);
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Then you can just do free(2d_arr);
where int** 2d_arr = allocateMatrix (nRows, nCols);
.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326113%2fusing-free-on-pointers-of-two-dimensional-array-with-multiple-malloc%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
You can only pass to free
what was received from malloc
. So the number of calls to free
must be the same as the number of calls to malloc
.
The first row of 2d_arr
, i.e. 2d_arr[0]
, contains &arr[0*cols]
== &arr[0]
== arr
. So you want to free that and matrix
itself:
free(2d_arr[0]);
free(2d_arr);
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
@TimWeissenfels Yes, since2d_arr
contains the same value asmatrix
, the effect is the same.
– dbush
Nov 15 '18 at 19:10
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
@TimWeissenfels You can only pass tofree
what was passed tomalloc
. So two of each.
– dbush
Nov 15 '18 at 19:20
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
|
show 1 more comment
You can only pass to free
what was received from malloc
. So the number of calls to free
must be the same as the number of calls to malloc
.
The first row of 2d_arr
, i.e. 2d_arr[0]
, contains &arr[0*cols]
== &arr[0]
== arr
. So you want to free that and matrix
itself:
free(2d_arr[0]);
free(2d_arr);
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
@TimWeissenfels Yes, since2d_arr
contains the same value asmatrix
, the effect is the same.
– dbush
Nov 15 '18 at 19:10
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
@TimWeissenfels You can only pass tofree
what was passed tomalloc
. So two of each.
– dbush
Nov 15 '18 at 19:20
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
|
show 1 more comment
You can only pass to free
what was received from malloc
. So the number of calls to free
must be the same as the number of calls to malloc
.
The first row of 2d_arr
, i.e. 2d_arr[0]
, contains &arr[0*cols]
== &arr[0]
== arr
. So you want to free that and matrix
itself:
free(2d_arr[0]);
free(2d_arr);
You can only pass to free
what was received from malloc
. So the number of calls to free
must be the same as the number of calls to malloc
.
The first row of 2d_arr
, i.e. 2d_arr[0]
, contains &arr[0*cols]
== &arr[0]
== arr
. So you want to free that and matrix
itself:
free(2d_arr[0]);
free(2d_arr);
edited Nov 15 '18 at 19:20
answered Nov 15 '18 at 18:52
dbushdbush
103k13108145
103k13108145
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
@TimWeissenfels Yes, since2d_arr
contains the same value asmatrix
, the effect is the same.
– dbush
Nov 15 '18 at 19:10
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
@TimWeissenfels You can only pass tofree
what was passed tomalloc
. So two of each.
– dbush
Nov 15 '18 at 19:20
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
|
show 1 more comment
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
@TimWeissenfels Yes, since2d_arr
contains the same value asmatrix
, the effect is the same.
– dbush
Nov 15 '18 at 19:10
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
@TimWeissenfels You can only pass tofree
what was passed tomalloc
. So two of each.
– dbush
Nov 15 '18 at 19:20
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
Is it ok when i do: free(2d_arr[0]); outside the func
– Tim Weissenfels
Nov 15 '18 at 19:09
@TimWeissenfels Yes, since
2d_arr
contains the same value as matrix
, the effect is the same.– dbush
Nov 15 '18 at 19:10
@TimWeissenfels Yes, since
2d_arr
contains the same value as matrix
, the effect is the same.– dbush
Nov 15 '18 at 19:10
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
Thank you for your quick response! but what I do not understand is why I only have to free() the first index from matrix :)
– Tim Weissenfels
Nov 15 '18 at 19:16
@TimWeissenfels You can only pass to
free
what was passed to malloc
. So two of each.– dbush
Nov 15 '18 at 19:20
@TimWeissenfels You can only pass to
free
what was passed to malloc
. So two of each.– dbush
Nov 15 '18 at 19:20
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
Ok! Thank you btw cool implementation of merge sort :)
– Tim Weissenfels
Nov 15 '18 at 19:22
|
show 1 more comment
This will work:
void freeMatrix( int **matrix )
free( matrix[ 0 ] );
free( matrix );
Because, for i == 0
, this code
matrix[i] = &(arr[i*cols]);
sets matrix[ 0 ]
to the address of arr[0]
, which is the same value returned from the first malloc
call:
int* arr = malloc(rows*cols*sizeof(int));
It's clearer if you write matrix allocation like
int** allocateMatrix(int rows, int cols)
int** matrix = malloc(rows*sizeof(int*));
matrix[ 0 ] = malloc(rows*cols*sizeof(int));
int i;
for(i=1; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Note the change in malloc()
order, the direct assignment to matrix[ 0 ]
, and the change in loop index to start at 1
.
add a comment |
This will work:
void freeMatrix( int **matrix )
free( matrix[ 0 ] );
free( matrix );
Because, for i == 0
, this code
matrix[i] = &(arr[i*cols]);
sets matrix[ 0 ]
to the address of arr[0]
, which is the same value returned from the first malloc
call:
int* arr = malloc(rows*cols*sizeof(int));
It's clearer if you write matrix allocation like
int** allocateMatrix(int rows, int cols)
int** matrix = malloc(rows*sizeof(int*));
matrix[ 0 ] = malloc(rows*cols*sizeof(int));
int i;
for(i=1; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Note the change in malloc()
order, the direct assignment to matrix[ 0 ]
, and the change in loop index to start at 1
.
add a comment |
This will work:
void freeMatrix( int **matrix )
free( matrix[ 0 ] );
free( matrix );
Because, for i == 0
, this code
matrix[i] = &(arr[i*cols]);
sets matrix[ 0 ]
to the address of arr[0]
, which is the same value returned from the first malloc
call:
int* arr = malloc(rows*cols*sizeof(int));
It's clearer if you write matrix allocation like
int** allocateMatrix(int rows, int cols)
int** matrix = malloc(rows*sizeof(int*));
matrix[ 0 ] = malloc(rows*cols*sizeof(int));
int i;
for(i=1; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Note the change in malloc()
order, the direct assignment to matrix[ 0 ]
, and the change in loop index to start at 1
.
This will work:
void freeMatrix( int **matrix )
free( matrix[ 0 ] );
free( matrix );
Because, for i == 0
, this code
matrix[i] = &(arr[i*cols]);
sets matrix[ 0 ]
to the address of arr[0]
, which is the same value returned from the first malloc
call:
int* arr = malloc(rows*cols*sizeof(int));
It's clearer if you write matrix allocation like
int** allocateMatrix(int rows, int cols)
int** matrix = malloc(rows*sizeof(int*));
matrix[ 0 ] = malloc(rows*cols*sizeof(int));
int i;
for(i=1; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Note the change in malloc()
order, the direct assignment to matrix[ 0 ]
, and the change in loop index to start at 1
.
answered Nov 15 '18 at 18:54
Andrew HenleAndrew Henle
20.5k31435
20.5k31435
add a comment |
add a comment |
I suggest that you use a single malloc()
to allocate the entire memory area so as to make it easier to manage as a single pointer.
I believe the following modified version of your function should work.
int** allocateMatrix(int rows, int cols)
size_t sMemSize = rows*sizeof(int*) + rows*cols*sizeof(int);
int** matrix = malloc(sMemSize);
int* arr = (int *) (matrix + rows);
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Then you can just do free(2d_arr);
where int** 2d_arr = allocateMatrix (nRows, nCols);
.
add a comment |
I suggest that you use a single malloc()
to allocate the entire memory area so as to make it easier to manage as a single pointer.
I believe the following modified version of your function should work.
int** allocateMatrix(int rows, int cols)
size_t sMemSize = rows*sizeof(int*) + rows*cols*sizeof(int);
int** matrix = malloc(sMemSize);
int* arr = (int *) (matrix + rows);
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Then you can just do free(2d_arr);
where int** 2d_arr = allocateMatrix (nRows, nCols);
.
add a comment |
I suggest that you use a single malloc()
to allocate the entire memory area so as to make it easier to manage as a single pointer.
I believe the following modified version of your function should work.
int** allocateMatrix(int rows, int cols)
size_t sMemSize = rows*sizeof(int*) + rows*cols*sizeof(int);
int** matrix = malloc(sMemSize);
int* arr = (int *) (matrix + rows);
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Then you can just do free(2d_arr);
where int** 2d_arr = allocateMatrix (nRows, nCols);
.
I suggest that you use a single malloc()
to allocate the entire memory area so as to make it easier to manage as a single pointer.
I believe the following modified version of your function should work.
int** allocateMatrix(int rows, int cols)
size_t sMemSize = rows*sizeof(int*) + rows*cols*sizeof(int);
int** matrix = malloc(sMemSize);
int* arr = (int *) (matrix + rows);
int i;
for(i=0; i<rows; i++)
matrix[i] = &(arr[i*cols]);
return matrix;
Then you can just do free(2d_arr);
where int** 2d_arr = allocateMatrix (nRows, nCols);
.
answered Nov 15 '18 at 19:41
Richard ChambersRichard Chambers
10.1k24268
10.1k24268
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53326113%2fusing-free-on-pointers-of-two-dimensional-array-with-multiple-malloc%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown