Sharing Memory Between Functions and Ownership
Learn about memory ownership.
We'll cover the following
Introduction
The ownership of local variables is clear. A function creates a local variable, uses it, and upon finishing its execution, it deallocates the local data.
We say that the function owns the variables or the memory. For example:
void func()
{
int x = 3;
x = x + 5;
printf("%d\n", x):
}
The scope of the local variable x
is limited to the func
function. We can say that func
owns the variable x
.
However, consider the following example, which involves dynamic memory allocations:
int* func()
{
int* x = malloc(sizeof(int));
if(x == NULL)
{
return NULL;
}
*x = *x + 5;
return x;
}
void func2()
{
int* x = func();
if(x != NULL)
{
printf("%d\n", *x);
}
free(x);
}
The func
function allocates memory for a variable x
. But then a pointer to this memory block is returned for use inside func2
, which calls func
. Who owns x
? Is it the func
function or the func2
function? The func
function allocates x
, but func2
uses and frees x
.
To answer this question, let’s consider a more detailed example.
The strdup
function
The strdup
function creates a dynamically allocated copy of a string. Don’t confuse it with strcopy
, which copies the data from a source buffer to a destination buffer, and we have to pass both. The strdup
function takes only a source buffer (str
) and dynamically allocates the destination buffer, returning a pointer to it (char*
).
char * strdup( const char *str );
Below is an example of using strdup
. We use it to duplicate the string str
, in line 10. Note that str
is a read-only string (string literal), while duplicate
is a read-write string, as it’s a dynamically allocated copy.
Get hands-on with 1400+ tech skills courses.