sizeof struct array

A

ak

struct xy{
int x;
int y;
}
_xy[32];

size_of_xy(struct xy * a) {
int len = sizeof a;
printf( "\sizeof xy: %i\n", len );
}

int main( int argc, char ** argv ) {
size_of_xy(_xy);
}

the problem is that size_of_xy prints size of xy struct.
I need to print size of _xy array.

any ideas?

Andrei
 
S

S.Tobias

ak said:
struct xy{
int x;
int y;
}
_xy[32];
size_of_xy(struct xy * a) {
int len = sizeof a;

ITYM sizeof *a;
The result of `sizeof' is type `size_t'.
printf( "\sizeof xy: %i\n", len );
}
int main( int argc, char ** argv ) {
size_of_xy(_xy);
}
the problem is that size_of_xy prints size of xy struct.
I need to print size of _xy array.

No way.
any ideas?

You have to pass the length of the array in another argument.

If you want more data encapsulation, you might think of sth like:

struct xy_array {
struct xy *xy_arr;
size_t xy_arr_len;
}; /*you are responsible for its contents*/

size_of_xy_array(struct xy_array *a) {
printf("size: %u\n", (unsigned)(sizeof(struct xy) * a->xy_arr_len));
}
 
M

Martin Ambuhl

ak said:
struct xy{
int x;
int y;
}
_xy[32];

size_of_xy(struct xy * a) {
int len = sizeof a;
printf( "\sizeof xy: %i\n", len );
}

int main( int argc, char ** argv ) {
size_of_xy(_xy);
}

the problem is that size_of_xy prints size of xy struct.
I need to print size of _xy array.

any ideas?

/* mha: you could read the FAQ before posting. Or if that's beyond
you, check the archives at groups.google.com. Those are the things
civilized people do before posting. In any case, consider the code
below */
#include <stdio.h>

#define array_size_info(a) do \
printf("The array has size %lu,"\
" each of the %lu elements has size %lu\n",\
sizeof a, sizeof a/sizeof *a, sizeof *a);\
while (0)

int main(void)
{
struct xy
{
int x;
int y;
}
xy[32];
array_size_info(xy);
return 0;
}


[output on my implementation]

The array has size 256, each of the 32 elements has size 8
 
A

ak

/* mha: you could read the FAQ before posting. Or if that's beyond
you, check the archives at groups.google.com. Those are the things
civilized people do before posting. In any case, consider the code
below */
#include <stdio.h>

#define array_size_info(a) do \
printf("The array has size %lu,"\
" each of the %lu elements has size %lu\n",\
sizeof a, sizeof a/sizeof *a, sizeof *a);\
while (0)

int main(void)
{
struct xy
{
int x;
int y;
}
xy[32];
array_size_info(xy);
return 0;
}


[output on my implementation]

The array has size 256, each of the 32 elements has size 8

#include <stdio.h>

#define array_size_info(a) do \
printf("The array has size %lu,"\
" each of the %lu elements has size %lu\n",\
sizeof a, sizeof a/sizeof *a, sizeof *a);\
while(0)

struct xy {
int x;
int y;
}
first_xy[32], second_xy[64];

void do_something(struct xy *_xy) {
array_size_info(_xy);
}

int main( void ) {
array_size_info( first_xy );
array_size_info( second_xy );
do_something(first_xy);
do_something(second_xy);
return 0;
}

the output is:

The array has size 256, each of the 32 elements has size 8
The array has size 512, each of the 64 elements has size 8
The array has size 4, each of the 0 elements has size 8
The array has size 4, each of the 0 elements has size 8

as you can see array_size_info works wrong in do_something();
 
M

Martin Ambuhl

ak said:
/* mha: you could read the FAQ before posting. Or if that's beyond
you, check the archives at groups.google.com. Those are the things
civilized people do before posting. In any case, consider the code
below */
#include <stdio.h>

#define array_size_info(a) do \
printf("The array has size %lu,"\
" each of the %lu elements has size %lu\n",\
sizeof a, sizeof a/sizeof *a, sizeof *a);\
while (0)

int main(void)
{
struct xy
{
int x;
int y;
}
xy[32];
array_size_info(xy);
return 0;
}


[output on my implementation]

The array has size 256, each of the 32 elements has size 8


#include <stdio.h>

#define array_size_info(a) do \
printf("The array has size %lu,"\
" each of the %lu elements has size %lu\n",\
sizeof a, sizeof a/sizeof *a, sizeof *a);\
while(0)

struct xy {
int x;
int y;
}
first_xy[32], second_xy[64];

void do_something(struct xy *_xy) {
array_size_info(_xy);
}

int main( void ) {
array_size_info( first_xy );
array_size_info( second_xy );
do_something(first_xy);
do_something(second_xy);
return 0;
}

the output is:

The array has size 256, each of the 32 elements has size 8
The array has size 512, each of the 64 elements has size 8
The array has size 4, each of the 0 elements has size 8
The array has size 4, each of the 0 elements has size 8

as you can see array_size_info works wrong in do_something();

It works fine. You gave it a broken argument. I suggested that you
should have read the FAQ. I repeat that. If you can't figure out that
the argument given to array_size_info in do_something is a pointer and
not an array, may God have mercy on your soul.
 
A

ak

If you can't figure out that
the argument given to array_size_info in do_something is a pointer and
not an array, may God have mercy on your soul.
sure, he has.

why I can't get size of array if I have only pointer to it?
 
A

Alex Fraser

ak said:
sure, he has.

why I can't get size of array if I have only pointer to it?

Because a pointer to an array holds a value that tells you where the start
of the array is, and nothing else (such as the size).

This is why, if you need it, you must pass the size of the array in another
argument. You might not always need the size; sometimes you can use a
sentinel value to indicate the end. A good example of this is strings in the
standard library, where '\0' is used as the sentinel value.

Alex
 
M

Martin Ambuhl

ak said:
sure, he has.

why I can't get size of array if I have only pointer to it?

I suggestes in my first reply, and repeated in the second, that you
should look to the FAQ, which you have obviously not done. How big a
hint do you need?
If you would *READ THE DAMN FAQ* you wouldn't keep asking these stupid
questions.
 
A

ak

I suggestes in my first reply, and repeated in the second, that you
should look to the FAQ, which you have obviously not done. How big a
hint do you need?
If you would *READ THE DAMN FAQ* you wouldn't keep asking these stupid
questions.

Stay cool.
I'll make it. Sometimes.
 
A

Al Bowers

ak said:
Stay cool.
I'll make it. Sometimes.

That's right! Keep cool.

You could make this array a typedef and then when your function
carries a pointer to this typedef, you can dereference it
for the size.

#include <stdio.h>

typedef struct _XY
{
int x;
int y;
} _XY[32];

void size_of_xy(_XY *a)
{
printf("The array has size %u,"
" Each of the %u elements has size %u\n"
"The pointer to the array has size %u\n",
sizeof *a,sizeof *a/sizeof(struct _XY),
sizeof(struct _XY),sizeof a);
}

int main(void)
{
_XY _xy;
size_of_xy(&_xy);
return 0;
}
 
B

Barry Schwarz

Stay cool.
I'll make it. Sometimes.

That's right! Keep cool.

You could make this array a typedef and then when your function
carries a pointer to this typedef, you can dereference it
for the size.

#include <stdio.h>

typedef struct _XY
{
int x;
int y;
} _XY[32];

void size_of_xy(_XY *a)
{
printf("The array has size %u,"
" Each of the %u elements has size %u\n"
"The pointer to the array has size %u\n",
sizeof *a,sizeof *a/sizeof(struct _XY),
sizeof(struct _XY),sizeof a);
}

sizeof returns a size_t which need not be an unsigned int. If you
want to use %u to print the results, then you should cast the values.

You have three formats in the format string but four arguments that
follow. The first following argument (size *a) should be deleted.

Also note that to refer to an actual structure in the array, this
function would need to specify a[0]. This is because a is a
pointer to the array so a[0] is the array at that address and a[0]
is the i-th element of the array.
int main(void)
{
_XY _xy;
size_of_xy(&_xy);
return 0;
}



<<Remove the del for email>>
 
K

Keith Thompson

ak said:
sure, he has.

why I can't get size of array if I have only pointer to it?

Have you read the FAQ?

You have a pointer to the first element of the array, not a pointer to
the array itself.

Have you read the FAQ?
 
A

ak

Have you read the FAQ?
not yet, sorry
You have a pointer to the first element of the array, not a pointer to
the array itself.

I thought there is no difference in c between pointer to array and pointer
to first element of array.

Andrei
 
J

Joe Wright

ak said:
not yet, sorry




I thought there is no difference in c between pointer to array and pointer
to first element of array.

Andrei

Why on earth would you think that? Consider..

int (*ap)[10]; /* a pointer to array 10 of int */
int *ip; /* a pointer to int */

Do the declarations of the two pointers even look the same?

Don't fight us Andrei, read something!
 
E

Emmanuel Delahaye

ak a formulé la demande :
not yet, sorry


I thought there is no difference in c between pointer to array and pointer
to first element of array.
The value is the same (probably) , but the type is different.

int main (void)
{
char s[123];

/* a pointer to a char */
char *psa = &s[0];
char *psb = s + 0;
char *psc = s;
char *psd = &s; /* warning */

/* a pointer to an array of 123 char */
char (*px)[123] = &s;
char (*py)[123] = s; /* warning */

return 0;
}
 
K

Keith Thompson

ak said:
not yet, sorry


I thought there is no difference in c between pointer to array and pointer
to first element of array.

You wouldn't think so if you'd read the FAQ.

The purpose of the FAQ is to answer Frequently Asked Questions, so we
don't have to spend time answering them over and over again here. A
lot of time and effort was dedicated to writing the FAQ list (mostly
by Steve Summit).

We've told you repeatedly that your questions are answered in the FAQ,
but you keep asking them.

If you don't want to read the FAQ, or if you want to put it off until
later, that's fine. But unti you've read it, please stop asking
questions that have already been answered for you. It's quite rude.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top