Link to home
Start Free TrialLog in
Avatar of trifusion
trifusion

asked on

Referencing an array structure element with a pointer

I would like to know how to reference an array in a function where the array of structures has been passed as a pointer.

If I have a structure:
typedef{
UInt32   A;
UInt16   B;
Char       C[5];
} Stuff

and I create an array:
  Stuff    myStuff[10];

and then pass a pointer to a routine:
Routine(&myStuff);

where the routine takes the pointer:
void Routine(Stuff *pStuff)
{

// do stuff

}

How do I reference say the 9th item A in the array myStuff from within the function Routine?

Thanks

Greg
ASKER CERTIFIED SOLUTION
Avatar of efn
efn

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Hi Greg...

  you can access your array by using the following code....

typedef struct{
short   A;
int     B;
char    C[5];
} Stuff ;

 
Stuff myStuff[10];

void Routine(Stuff *pStuff)
{
     for(int i = 0; i < 10; i++){     // you can access a pointer as an array and vice-versa
          printf("%d",  pStuff[i].B );
      }
}


int main()
{
  int i ;

  for(i = 0; i < 10; i++){
        myStuff[i].B = i + 1;
  }

  Routine(myStuff);
  return 0 ;
}



Dennis
Avatar of Ajar
Ajar

trifusion,

Because the array myStuff has been statically allocated memory ..i.e  
>> Stuff    myStuff[10];
instead of
>> Stuff   *myStuff  = (Stuff *) malloc(10* sizeof(Stuff));

it will be wise to declare the function Routine as
====================================
 void (Stuff  pStuff[] )
{
    // check if the size of pstuff is enough for accessing 9th element
    if( sizeof(pstuff)/sizeof(stuff)  >9)  
    { // ACCESS THE 9th element as
      pStuff[8].A = 75
    }
     else
    //   BE AFRAID THAT you will do illegal memory access and so quietly return
    return;
}
====================================
Basically    if you pass the pstuff   as    "Stuff  pStuff[]"   to a function then the function
can check the array size by using 'sizeof ()' .

where as  if you pass  'Stuff * pStuff' .. your function has no way to ensure that there wont be illegal access unless you
also pass the array length along with the pointer

void (Stuff  pStuff[] , int pStuff_len)
{
////Do something.
}


> Basically    if you pass the pstuff   as    "Stuff  pStuff[]"   to a function then the function
> can check the array size by using 'sizeof ()' .

I am inclined to doubt this assertion.  sizeof is a compile-time operation.  When the compiler compiles a function definition with an array argument of unspecified size, the compiler does not know what will be passed to the function at run time, so it can't give you the size of the array.  What it does give you is the size of the pointer that is actually passed.

I tested this with Microsoft Visual C++ 6.0 and Borland C++Builder 4.  With both compilers, when I passed an array of 17 integers, the called function reported the size as 4, the size of a pointer.

--efn
Avatar of trifusion

ASKER

All the comments I am sure are valid, but I am self-taught C and I really was just looking for the correct syntax for describing the array once passed as a pointer to a function.

I appreciate the memory notes, I am programming in Palm OS and so I am very aware of the memory issues.

Thanks to all who replied.

Greg