Structure memory allocation

T

Trying_Harder

Consider the following declaration,

#include <stdio.h>
#include <stdlib.h>

typedef struct foo {
char name[30];
int age;
}Foo;

typedef struct bar {
char * name;
int age;
}Bar;

typedef struct baz {
char name[30];
int *age;
}Baz;

int main()
{
Foo f1,f2;
Bar b1,b2;
Baz c1,c2;

/* Populating structure */
strcpy(f1.name,"JACK");
f1.age=10;

/* CASE 1 - Works fine */
f2=f1;
printf("\n F2 Members, Name %s , Age %d ", f2.name, f2.age);
printf("\n F1 Pointer %p , F2 Pointer %p ", f1, f2);


/* CASE 2 - Hmmmm.. I don't have an explanation for this */
b1.name = malloc(sizeof(char)*10);
strcpy(b1.name,"LACK");
b1.age=20;

b2=b1; /*Assignment??*/
printf("\n B2 Members, Name %s , Age %d ", b2.name, b2.age);
printf("\n B1 Pointer %p , B2 Pointer %p ", b1, b2);
/* This will print the same address out. */
printf("\n B1 Name Pointer %p , B2 Name Pointer %p ", b1.name, \
b2.name);


/* CASE 3 - As expected, does not work */
c1.age = malloc(sizeof(int));
strcpy(c1.name,"MACK");
*(c1.age)=30;

c2=c1; /*Assignment??*/
printf("\n C2 Members, Name %s , Age %d ", c2.name, c2.age);
printf("\n C1 Pointer %p , C2 Pointer %p ", c1, c2);

/* But this will print the same address out, how come? */
printf("\n C1 Name Pointer %p , C2 Name Pointer %p ", c1.age ,\
c2.age );

exit(EXIT_SUCCESS);
}


Let me begin with apologies for posting so much of code.

Clarification 1 : Is copying structures by simply assigning them, valid
(legal) portable, pedantic ?
<My Opinion> : No. If someone argues, please reason.

Clarification 2 : Why is case 2 working ?

Clarification 3 : In case 3, you will notice the address copied exactly.
Does copying address mean pointing to the same
location?
 
M

Morris Dovey

Trying_Harder said:
Clarification 1 : Is copying structures by simply assigning them, valid
(legal) portable, pedantic ?
<My Opinion> : No. If someone argues, please reason.

It's legal and portable (see standard)
Clarification 2 : Why is case 2 working ?

Why would you not expect it to work?
Clarification 3 : In case 3, you will notice the address copied exactly.
Does copying address mean pointing to the same
location?

It does, but you'd do better with:

printf("\n C2 Members, Name %s , Age %d ", c2.name, *c2.age);

since c2.age is a pointer (as you remembered in your next statement.
 
J

Jake Roersma

#include <stdio.h>
#include <stdlib.h>

#include said:
typedef struct baz {
char name[30];
int *age;
}Baz;

int main()
{
Foo f1,f2;
Bar b1,b2;
Baz c1,c2;

/* Populating structure */
strcpy(f1.name,"JACK");
f1.age=10;

/* CASE 1 - Works fine */
printf("\n F1 Pointer %p , F2 Pointer %p ", f1, f2);

This may work but is not right. Try:

printf("\n F1 Pointer %p , F2 Pointer %p ", &f1, &f2);
printf("\n B1 Pointer %p , B2 Pointer %p ", b1, b2);

And again....

printf("\n B1 Pointer %p , B2 Pointer %p ", &b1, &b2);
printf("\n C2 Members, Name %s , Age %d ", c2.name, c2.age);

You'll need to dereference c2.age to get its value:

printf("\n C2 Members, Name %s , Age %d ", c2.name, *c2.age);
printf("\n C1 Pointer %p , C2 Pointer %p ", c1, c2);

I hate to be repetitive.. but...

printf("\n C1 Pointer %p , C2 Pointer %p ", &c1, &c2);
/* But this will print the same address out, how come? */
printf("\n C1 Name Pointer %p , C2 Name Pointer %p ", c1.age ,\
c2.age );

free(b1.name);
free(c1.age);
exit(EXIT_SUCCESS);
}


Let me begin with apologies for posting so much of code.

Clarification 1 : Is copying structures by simply assigning them, valid
(legal) portable, pedantic ?

legal and portable.
Clarification 2 : Why is case 2 working ?

Other than the fact you are not freeing the memory you've allocated I
don't see any reason as to why it shouldn't work.
Clarification 3 : In case 3, you will notice the address copied exactly.
Does copying address mean pointing to the same
location?

Yep.

- Jake
 
A

Al Bowers

Trying_Harder said:
Consider the following declaration,

#include <stdio.h>
#include <stdlib.h>

#include said:
typedef struct foo {
char name[30];
int age;
}Foo;

typedef struct bar {
char * name;
int age;
}Bar;

typedef struct baz {
char name[30];
int *age;
}Baz;

int main()
{
Foo f1,f2;
Bar b1,b2;
Baz c1,c2;

/* Populating structure */
strcpy(f1.name,"JACK");
f1.age=10;

/* CASE 1 - Works fine */
f2=f1;
printf("\n F2 Members, Name %s , Age %d ", f2.name, f2.age);
printf("\n F1 Pointer %p , F2 Pointer %p ", f1, f2);

%p specifies a void* argument. f1 and f2 need to be pointers that
should be cast to void*.
printf("\n F1 Pointer %p, F2 Pointer %p ", (void*)&f1, (void*)&f2);
/* CASE 2 - Hmmmm.. I don't have an explanation for this */
b1.name = malloc(sizeof(char)*10);
strcpy(b1.name,"LACK");
b1.age=20;

b2=b1; /*Assignment??*/
printf("\n B2 Members, Name %s , Age %d ", b2.name, b2.age);
printf("\n B1 Pointer %p , B2 Pointer %p ", b1, b2);
/* This will print the same address out. */
printf("\n B1 Name Pointer %p , B2 Name Pointer %p ", b1.name, \
b2.name);
/* CASE 3 - As expected, does not work */
c1.age = malloc(sizeof(int));
strcpy(c1.name,"MACK");
*(c1.age)=30;

c2=c1; /*Assignment??*/
printf("\n C2 Members, Name %s , Age %d ", c2.name, c2.age);
*c2.age

printf("\n C1 Pointer %p , C2 Pointer %p ", c1, c2);

/* But this will print the same address out, how come? */
printf("\n C1 Name Pointer %p , C2 Name Pointer %p ", c1.age ,\
c2.age );

Perhaps you are being confused by the above printf statement. You
are printing "Name Pointer" but your arguments refer to the age members.
Shouldn't these be:

printf("C1 Name Pointer %p , C2 Name Pointer %p\n",
(void*) c1.name ,(void*)c2.name);
printf("C1 Age Pointer %p , C2 Age Pointer %p\n", (void*)c1.age ,
(void*)c2.age );
exit(EXIT_SUCCESS);
}
Clarification 3 : In case 3, you will notice the address copied exactly.
Does copying address mean pointing to the same
location?

Try the corrected code and see if you still need clarification.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct foo {
char name[30];
int age;
}Foo;

typedef struct bar {
char * name;
int age;
}Bar;

typedef struct baz {
char name[30];
int *age;
}Baz;

int main(void)
{
Foo f1,f2;
Bar b1,b2;
Baz c1,c2;

strcpy(f1.name,"JACK");
f1.age=10;
f2=f1;
printf("F2 Members, Name %s , Age %d\n", f2.name, f2.age);
printf("F1 Pointer %p , F2 Pointer %p\n", (void*)&f1, (void*)&f2);
b1.name = malloc(sizeof(char)*10);
strcpy(b1.name,"LACK");
b1.age=20;
b2=b1; /*Assignment??*/
printf("B2 Members, Name %s , Age %d\n", b2.name, b2.age);
printf("B1 Pointer %p , B2 Pointer %p\n", (void*)&b1, (void*)&b2);
/* This will print the same address out. */
printf("B1 Name Pointer %p , B2 Name Pointer %p\n",
(void*)b1.name, (void*)b2.name);
c1.age = malloc(sizeof(int));
strcpy(c1.name,"MACK");
*(c1.age)=30;
c2=c1; /*Assignment??*/
printf("C2 Members, Name %s , Age %d\n", c2.name, *c2.age);
printf("C1 Pointer %p , C2 Pointer %p\n", (void*)&c1, (void*)&c2);
printf("C1 Name Pointer %p , C2 Name Pointer %p\n",
(void*) c1.name ,(void*)c2.name);
printf("C1 Age Pointer %p , C2 Age Pointer %p\n", (void*)c1.age ,
(void*)c2.age );
return 0;
}
 
I

Irrwahn Grausewitz

Jake Roersma said:
This may work but is not right. Try:

printf("\n F1 Pointer %p , F2 Pointer %p ", &f1, &f2);

The printf %p conversion specification requires a void pointer argument;
so make it:

printf("\n F1 Pointer %p , F2 Pointer %p ", (void *)&f1, (void *)&f2);
And again....

printf("\n B1 Pointer %p , B2 Pointer %p ", &b1, &b2);
.... and again ...

printf("\n B1 Pointer %p , B2 Pointer %p ", (void *)&b1, (void *)&b2);
You'll need to dereference c2.age to get its value:

printf("\n C2 Members, Name %s , Age %d ", c2.name, *c2.age);


I hate to be repetitive.. but...

printf("\n C1 Pointer %p , C2 Pointer %p ", &c1, &c2);
.... me too, but ... ;)

printf("\n C1 Pointer %p , C2 Pointer %p ", (void *)&c1, (void *)&c2);

<SNIP>
Note that the only useful application for printing out pointer values I
know of is for debugging purposes.

Regards

Irrwahn
 

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,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top