Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > pointer to struct

Reply
Thread Tools

pointer to struct

 
 
=?iso-8859-1?B?cG92b2Hn428=?=
Guest
Posts: n/a
 
      12-06-2006
can´t understand why the program above not works.
thanks all


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

#define SIZE 3

struct peoples
{
int code;
char name[20];
float value;
};



int main()
{
int a;
struct peoples *people;
people=(struct peoples *)malloc(SIZE*sizeof(struct peoples));
for(a=0;a<SIZE;a++)
{
people->code=a;
scanf("%s",people->name);
scanf("%f",people->value);
people++;
}
for(a=0;a<SIZE;a++)
{
printf("%d",people->code);
printf("%s",people->name);
printf("%f",people->value);
people++;
}
}

 
Reply With Quote
 
 
 
 
ls@qustation.com
Guest
Posts: n/a
 
      12-06-2006
You only have on struct and one pointer. Why are you incrementing the
pointer? Why are you looping? Maybe you need an array of structs 3
(SIZE) pointers and need to loop through the array to allocate structs,
loop to assign values, then loop to acces the values.

On Dec 6, 9:48 am, "povoação" <okle...@gmail.com> wrote:
> can´t understand why the program above not works.
> thanks all
>
> #include <stdio.h>
> #include <stdlib.h>
>
> #define SIZE 3
>
> struct peoples
> {
> int code;
> char name[20];
> float value;
>
> };int main()
> {
> int a;
> struct peoples *people;
> people=(struct peoples *)malloc(SIZE*sizeof(struct peoples));
> for(a=0;a<SIZE;a++)
> {
> people->code=a;
> scanf("%s",people->name);
> scanf("%f",people->value);
> people++;
> }
> for(a=0;a<SIZE;a++)
> {
> printf("%d",people->code);
> printf("%s",people->name);
> printf("%f",people->value);
> people++;
> }
>
> }


 
Reply With Quote
 
 
 
 
Ben Pfaff
Guest
Posts: n/a
 
      12-06-2006
"povoação" <> writes:

> int main()


I'd recommend using the prototype form:
int main(void)

> {
> int a;
> struct peoples *people;


This is very creative naming, to give the pointer to the
beginning of an array a relatively singular name, and the
structure type that the array contains a relatively plural name.
Most programmers would probably do it differently, e.g.
struct person *people;

> people=(struct peoples *)malloc(SIZE*sizeof(struct peoples));


I don't recommend casting the return value of malloc():

* The cast is not required in ANSI C.

* Casting its return value can mask a failure to #include
<stdlib.h>, which leads to undefined behavior.

* If you cast to the wrong type by accident, odd failures can
result.

In unusual circumstances it may make sense to cast the return value of
malloc(). P. J. Plauger, for example, has good reasons to want his
code to compile as both C and C++, and C++ requires the cast, as he
explained in article <9sFIb.9066$>.
However, Plauger's case is rare indeed. Most programmers should write
their code as either C or C++, not in the intersection of the two.

When calling malloc(), I recommend using the sizeof operator on
the object you are allocating, not on the type. For instance,
*don't* write this:

int *x = malloc (128 * sizeof (int)); /* Don't do this! */

Instead, write it this way:

int *x = malloc (128 * sizeof *x);

There's a few reasons to do it this way:

* If you ever change the type that `x' points to, it's not
necessary to change the malloc() call as well.

This is more of a problem in a large program, but it's still
convenient in a small one.

* Taking the size of an object makes writing the statement
less error-prone. You can verify that the sizeof syntax is
correct without having to look at the declaration.

> for(a=0;a<SIZE;a++)
> {
> people->code=a;
> scanf("%s",people->name);


You need to specify a maximum length, or this can lead to a
buffer overflow.

> scanf("%f",people->value);


You forgot to take the address: &people->value.

> people++;
> }
> for(a=0;a<SIZE;a++)
> {
> printf("%d",people->code);
> printf("%s",people->name);
> printf("%f",people->value);
> people++;
> }


This isn't going to work, because in your first loop you already
advanced "people" past the records you're trying to print. I'd
suggest dropping the "people++" from both loops and using array
index notation instead for each member reference,
e.g. people[a].code.

> }



--
"In My Egotistical Opinion, most people's C programs should be indented six
feet downward and covered with dirt." -- Blair P. Houghton
 
Reply With Quote
 
matevzb
Guest
Posts: n/a
 
      12-06-2006
povoação wrote:
> can´t understand why the program above not works.

For many reasons.

> people=(struct peoples *)malloc(SIZE*sizeof(struct peoples));
> for(a=0;a<SIZE;a++)
> {
> people->code=a;
> scanf("%s",people->name);
> scanf("%f",people->value);
> people++;
> }

You're incrementing people (pointer to struct peoples), which after the
first for loop points to where? You'd be better of with:
people[a].code = a;
Secondly, scanf() arguments should be pointers so use:
scanf ("%f", &people[a].value);
For char arrays, you can use either people[a].name or
&people[a].name[0]. Some prefer the second version.
Thirdly, you're not checking for scanf() return values. If someone
doesn't enter a float when you expect it, your program will misbehave.
Also, your people[a].name is limited to 20 characters, it won't work if
someone enters more than that - check the scanf() man page.

> }
> for(a=0;a<SIZE;a++)
> {
> printf("%d",people->code);
> printf("%s",people->name);
> printf("%f",people->value);
> people++;
> }

Again, don't increment people, use people[a]. Outputting a newline now
and then may also be a good thing.

 
Reply With Quote
 
Ben Pfaff
Guest
Posts: n/a
 
      12-06-2006
"" <> writes:

> You only have on struct and one pointer.


Read his code again. He allocates an array of SIZE structs.
--
"IMO, Perl is an excellent language to break your teeth on"
--Micah Cowan
 
Reply With Quote
 
=?iso-8859-1?B?cG92b2Hn428=?=
Guest
Posts: n/a
 
      12-06-2006
I modified to people[a] instead pointer and works well, but I´m
learning pointers and I can´t understand cause was not working with
pointer.
I corrected scanf, I´d miss &.
I try modify also the line people=malloc(SIZE * sizeof *people); and
i got error at compile time invalid conversion from void* to peoples*.

thanks



On Dec 6, 4:10 pm, "matevzb" <mate...@gmail.com> wrote:
> povoação wrote:
> > can´t understand why the program above not works.For many reasons.

>
> > people=(struct peoples *)malloc(SIZE*sizeof(struct peoples));
> > for(a=0;a<SIZE;a++)
> > {
> > people->code=a;
> > scanf("%s",people->name);
> > scanf("%f",people->value);
> > people++;
> > }You're incrementing people (pointer to struct peoples), which after the

> first for loop points to where? You'd be better of with:
> people[a].code = a;
> Secondly, scanf() arguments should be pointers so use:
> scanf ("%f", &people[a].value);
> For char arrays, you can use either people[a].name or
> &people[a].name[0]. Some prefer the second version.
> Thirdly, you're not checking for scanf() return values. If someone
> doesn't enter a float when you expect it, your program will misbehave.
> Also, your people[a].name is limited to 20 characters, it won't work if
> someone enters more than that - check the scanf() man page.
>
> > }
> > for(a=0;a<SIZE;a++)
> > {
> > printf("%d",people->code);
> > printf("%s",people->name);
> > printf("%f",people->value);
> > people++;
> > }Again, don't increment people, use people[a]. Outputting a newline now

> and then may also be a good thing.


 
Reply With Quote
 
Ben Pfaff
Guest
Posts: n/a
 
      12-06-2006
"povoação" <> writes:

> I try modify also the line people=malloc(SIZE * sizeof *people); and
> i got error at compile time invalid conversion from void* to peoples*.


It sounds like you're using a C++ compiler.
--
Ben Pfaff
email:
web: http://benpfaff.org
 
Reply With Quote
 
matevzb
Guest
Posts: n/a
 
      12-06-2006
povoação wrote:
> I modified to people[a] instead pointer and works well, but I´m
> learning pointers and I can´t understand cause was not working with
> pointer.

Well, think of it this way. You are allocating memory that will hold
three structures. malloc() returns the pointer to this memory and you
assign it to variable people. When you increment people (people++),
people will then point to the next element and you no longer have a
pointer to the allocated block:
| 0 | 1 | 2 | | 0 | 1 | 2 |
^ ^
people people

But in order to print out the values in the second loop, you do need
the original pointer, however people is not pointing there anymore.
Either access the allocated memory as an array (people[a]), or remember
the original pointer and after before the second loop, set the people
to point there.

> I try modify also the line people=malloc(SIZE * sizeof *people); and
> i got error at compile time invalid conversion from void* to peoples*.
>
> thanks

I cannot comment on the sizeof usage, as my perception differs a lot
from what Ben said. I never use sizeof without ()s and I never use it
on variables, but types insetad. The reason for that is the following:
char buf[10];
...
some_function (sizeof (buf));
If in future the buf type is changed from an array to a char *,
sizeof(buf) will get a _very_ different meaning. In small projects, the
bug will be easy to find, however once you have > 100,000 lines of code
and the crash only happens on a customer's machine to which you don't
have access (and, of course, the bug is not reproducible in the lab),
you could spend days before the problem is found. Been there, done
that. So, where Ben said "Don't do this!", I always do =)
--
WYCIWYG - what you C is what you get

 
Reply With Quote
 
=?iso-8859-1?B?cG92b2Hn428=?=
Guest
Posts: n/a
 
      12-06-2006
It´s true. I saved .c and now compiles. I´m using Dev-C++ now.
Can help me to fix the program to work with pointers notation?

On Dec 6, 5:05 pm, Ben Pfaff <b...@cs.stanford.edu> wrote:
> "povoação" <okle...@gmail.com> writes:
> > I try modify also the line people=malloc(SIZE * sizeof *people); and
> > i got error at compile time invalid conversion from void* to peoples*.It sounds like you're using a C++ compiler.

> --
> Ben Pfaff
> email: b...@cs.stanford.edu
> web:http://benpfaff.org


 
Reply With Quote
 
Ben Pfaff
Guest
Posts: n/a
 
      12-06-2006
"povoação" <> writes:

> Can help me to fix the program to work with pointers notation?


If a problem is easily solved using array notation, then there is
no need to solve it another way.
--
A competent C programmer knows how to write C programs correctly,
a C expert knows enough to argue with Dan Pop, and a C expert
expert knows not to bother.
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Struct pointer vs. struct array pointer aleksa C Programming 16 02-20-2013 08:20 PM
Can *common* struct-members of 2 different struct-types, that are thesame for the first common members, be accessed via pointer cast to either struct-type? John Reye C Programming 28 05-08-2012 12:24 AM
(: Pointer to struct withing pointer to struct :) Zero C Programming 16 11-19-2005 01:27 AM
passing pointer->struct->pointer->struct to function. .. ?? beetle C Programming 2 01-25-2005 06:08 PM
struct my_struct *p = (struct my_struct *)malloc(sizeof(struct my_struct)); Chris Fogelklou C Programming 36 04-20-2004 08:27 AM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57