goGopher
goGopher

Reputation: 45

Why the addresses of array- and pointer-argument of two different functions are the same?

I have the following code from Chapter 9 of Expert C Programming - Deep C Secrets by Peter van der Linden.

char ga[] = "abcdefghijklm";

void my_array_func( char ca[10] )
{
  printf(" addr of array param = %#x \n",&ca);
  printf(" addr (ca[0]) = %#x \n",&(ca[0]));
}

void my_pointer_func( char *pa )
{
  printf(" addr of ptr param = %#x \n",&pa);
  printf(" addr (pa[0]) = %#x \n",&(pa[0]));
}

main()
{
  printf(" addr of global array = %#x \n",&ga);
  printf(" addr (ga[0]) = %#x \n",&(ga[0]));
  my_array_func( ga );
  my_pointer_func( ga );
}

The output looks like:

addr of global array = 0x870f018  
addr (ga[0]) = 0x870f018  

addr of array param = 0x574f17c8  
addr (ca[0]) = 0x870f018  

addr of ptr param = 0x574f17c8  
addr (pa[0]) = 0x870f018  

I am confused why addr of array param and addr of ptr param are the same. As for me, ca and pa are two different pointers, and thus their addresses should be different. Anyone can help to explain?

As a contrast:

main ()  
{
  int a = 1;
  int *p1 = &a;
  int *p2 = &a;

  printf("add of p1 = %#x \n", &p1);
  printf("add of p2 = %#x \n", &p2);
}

will give result of different addresses:

addr of p1 = 0x50a687e0    
addr of p2 = 0x50a687d8    

What's the difference between the two code pieces?

Upvotes: 3

Views: 71

Answers (1)

R Sahu
R Sahu

Reputation: 206557

I am confused why addr of array param and addr of ptr para are the same. As for me, ca and pa are two different pointers, and thus their addresses should be different. Anyone can help to explain?

It's coincidence.

The memory requirements of the stack frame for my_array_func and my_pointer_func are same. Hence, the address used to store the argument is same.

Also, remember that

void my_array_func( char ca[10] )

is the same as

void my_array_func( char* ca )

If you introduce another layer of function before the call to my_pointer_func, you'll see that the addresses are not the same.

#include <stdio.h>

char ga[] = "abcdefghijklm";

void my_array_func( char ca[10] )
{
  printf(" addr of array param = 0x%p \n",&ca);
  printf(" addr (ca[0]) = 0x%p \n",&(ca[0]));
}

void my_pointer_func( char *pa )
{
  printf(" addr of ptr param = 0x%p \n",&pa);
  printf(" addr (pa[0]) = 0x%p \n",&(pa[0]));
}

void intermediate_func(char* pa)
{
  my_pointer_func( pa );
}

int main()
{
  printf(" addr of global array = 0x%p \n",&ga);
  printf(" addr (ga[0]) = 0x%p \n",&(ga[0]));
  my_array_func( ga );
  my_pointer_func( ga );
  intermediate_func( ga );
}

Output:

 addr of global array = 0x0x601040 
 addr (ga[0]) = 0x0x601040 
 addr of array param = 0x0x7fffee05cf98 
 addr (ca[0]) = 0x0x601040 
 addr of ptr param = 0x0x7fffee05cf98 
 addr (pa[0]) = 0x0x601040 
 addr of ptr param = 0x0x7fffee05cf78 
 addr (pa[0]) = 0x0x601040 

Upvotes: 2

Related Questions