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
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
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
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(stuf f) >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.
}
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(stuf
{ // 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
> 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
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
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
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