Exactly, to modify a pointer you need a pointer to that pointer. Remember
in C, function parameters are "read only" because they're always copies of
the calling variable's values.

This is wrong:

function abcd(void *p) {
  p = malloc(sizeof(int)); // Memory leaking
  *p = 1;
}

main () {
  int *p = malloc(sizeof(int)); // [1]
  *p = 0;
  abcd(p); // Sends a copy of the value of p

  // p is still pointing to memory reserved by [1], so *p equals 0

}

This is OK:

function abcd(void **p) {
  *p = malloc(sizeof(int));
  **p = 1;
}

main() {
  int i = 0;
  int *p = &i; // p has the address where i is located

  // Here *p is 0

  efgh(&p); // Sends a copy of the address where p is stored

  // Now p is pointing to some address in the heap segment, and *p is 1

}

IMHO you need to be careful when allocating memory inside functions. In
some cases it would be a good practice checking the value of the pointer
before allocating (!null) to avoid memory leaking. However, if you look at
this last example, p is pointing to local memory, and you can overwrite
it's value safely (so checking if p is not null before allocating wouldn't
be any help).

But, if you call this function twice, you will leak memory:

  efgh(&p); // [1]
  efgh(&p);
  // Now you can't free the memory reserved at [1]

Cheers,
Emiliano.


On Mon, Mar 28, 2016 at 4:55 PM, Edward Bartolo <edb...@gmail.com> wrote:

> Hi,
>
> Thanks for dedicating some of your time to answer me. I used:
>
> void change_value(void** ptr)
>
> Because I wanted to enable myself to allocate memory for the pointer
> inside the function, therefore I needed a pointer to a pointer of type
> void. Void allows such a function to handle different data types in
> which case an ordinal typed parameter may be used to allow a switch
> statement within the function to handle the different data types. I
> used such a construct in Delphi Pascal in the past, and consider it a
> powerful feature that can have its uses. This is why I am anxious to
> comprehend the why behind pointer to pointer use.
>
> This is a program employing the use of a pointer to change the value
> of a parameter inside a function.
>
> #include <stdio.h>
> #include <stdlib.h>
>
> int afunc(double* dd) {
>   *dd *= 2;
> }
>
> int main() {
>   double* mm;
>   mm = malloc(sizeof(double));
>   printf("value of mm after creation, unassigned: %f\n", *mm);
>   *mm = 1.0;
>
>   int j;
>   for (j = 1; j <= 20; j++) {
>     afunc(mm);
>     printf("value of mm after function call %d: %f\n", j, *mm);
>   }
>
>   free(mm);
>
>   return 0;
> }
>
> I will post tomorrow a reply illustrating the allocation of memory to
> a pointer within a function. This means the function must be able to
> modify the pointer not only its data. For that I will probably need a
> pointer to a pointer or use typecasting with a standard data type
> having the same number of bytes as a pointer. The reason for this is
> the fact that a pointer is a number.
>
> I found using the return value of a function makes code much more
> readable and probably more reliable. Multiple return values can be
> encapsulated inside a structure which would be returned by a function.
> I used this construct in simple-netaid-lightweight which avoids the
> use of GtkBuilder.
>
> Edward
> _______________________________________________
> Dng mailing list
> Dng@lists.dyne.org
> https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng
>
_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to