Connecting Tech Pros Worldwide Forums | Help | Site Map

pointer to struct

povoação
Guest
 
Posts: n/a
#1: Dec 6 '06
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++;
}
}


ls@qustation.com
Guest
 
Posts: n/a
#2: Dec 6 '06

re: pointer to struct


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.comwrote:
Quote:
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++;
}

}
Ben Pfaff
Guest
 
Posts: n/a
#3: Dec 6 '06

re: pointer to struct


"povoação" <okleber@gmail.comwrites:
Quote:
int main()
I'd recommend using the prototype form:
int main(void)
Quote:
{
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;
Quote:
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$nK2.4505@nwrddc01.gnilink.net>.
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.
Quote:
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.
Quote:
scanf("%f",people->value);
You forgot to take the address: &people->value.
Quote:
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.
Quote:
}

--
"In My Egotistical Opinion, most people's C programs should be indented six
feet downward and covered with dirt." -- Blair P. Houghton
matevzb
Guest
 
Posts: n/a
#4: Dec 6 '06

re: pointer to struct


povoação wrote:
Quote:
can´t understand why the program above not works.
For many reasons.
Quote:
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.
Quote:
}
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.

Ben Pfaff
Guest
 
Posts: n/a
#5: Dec 6 '06

re: pointer to struct


"ls@qustation.com" <lsearchw@gmail.comwrites:
Quote:
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
povoação
Guest
 
Posts: n/a
#6: Dec 6 '06

re: pointer to struct


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.comwrote:
Quote:
povoação wrote:
Quote:
can´t understand why the program above not works.For many reasons.
>
Quote:
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 afterthe
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.
>
Quote:
}
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.
Ben Pfaff
Guest
 
Posts: n/a
#7: Dec 6 '06

re: pointer to struct


"povoação" <okleber@gmail.comwrites:
Quote:
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: blp@cs.stanford.edu
web: http://benpfaff.org
matevzb
Guest
 
Posts: n/a
#8: Dec 6 '06

re: pointer to struct


povoação wrote:
Quote:
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.
Quote:
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

povoação
Guest
 
Posts: n/a
#9: Dec 6 '06

re: pointer to struct


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.eduwrote:
Quote:
"povoação" <okle...@gmail.comwrites:
Quote:
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
Ben Pfaff
Guest
 
Posts: n/a
#10: Dec 6 '06

re: pointer to struct


"povoação" <okleber@gmail.comwrites:
Quote:
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.
Default User
Guest
 
Posts: n/a
#11: Dec 6 '06

re: pointer to struct


povoação wrote:
Quote:
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?

Please don't top-post. Your replies belong following or interspersed
with properly trimmed quotes. See the majority of other posts in the
newsgroup, or:
<http://www.caliburn.nl/topposting.html>
Fred Kleinschmidt
Guest
 
Posts: n/a
#12: Dec 6 '06

re: pointer to struct


On Dec 6, 4:10 pm, "matevzb" <mate...@gmail.comwrote:
Quote:
povoação wrote:
Quote:
can´t understand why the program above not works.For many reasons.
>
Quote:
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.
>
Quote:
}
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.
"povoação" <okleber@gmail.comwrote in message
news:1165431049.095367.208970@80g2000cwy.googlegro ups.com...
Quote:
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.
in your first loop, you included:
for(a=0;a<SIZE;a++) {

people++;
}

So, where does "people" now point?

Then your second loop:

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

Just because you began a new loop, this does not
mean the "people" magically again points to the
original place.

If you insist on using pointers, try:

struct peoples *p = people;
for(a=0;a<SIZE;a++) {
scanf("%s",p->name);
scanf("%f",&p->value);
p++;
}
p = people; /* resets to point to origin of allcated structs */
for(a=0;a<SIZE;a++) {
...
p++;
}

(still contains problems pointed out by others)

Fred L. Kleinschmidt
Boeing Associate Technical Fellow
Technical Architect, Software Reuse Project


Keith Thompson
Guest
 
Posts: n/a
#13: Dec 6 '06

re: pointer to struct


Ben Pfaff <blp@cs.stanford.eduwrites:
Quote:
"povoação" <okleber@gmail.comwrites:
Quote:
>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.
Unless the actual problem is learning to use pointer notation.

--
Keith Thompson (The_Other_Keith) kst-u@mib.org <http://www.ghoti.net/~kst>
San Diego Supercomputer Center <* <http://users.sdsc.edu/~kst>
We must do something. This is something. Therefore, we must do this.
CBFalconer
Guest
 
Posts: n/a
#14: Dec 7 '06

re: pointer to struct


Ben Pfaff wrote:
Quote:
"ls@qustation.com" <lsearchw@gmail.comwrites:
>
Quote:
You only have on struct and one pointer.
>
Read his code again. He allocates an array of SIZE structs.
And then uses it as if it held 2 * SIZE structs. Boom.

--
Chuck F (cbfalconer at maineline dot net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net>


povoação
Guest
 
Posts: n/a
#15: Dec 7 '06

re: pointer to struct


thanks all. Now works with pointers. Thanks for the tips too.

On Dec 6, 11:03 pm, CBFalconer <cbfalco...@yahoo.comwrote:
Quote:
Ben Pfaff wrote:
Quote:
"l...@qustation.com" <lsear...@gmail.comwrites:
>
Quote:
Quote:
You only have on struct and one pointer.
>
Quote:
Read his code again. He allocates an array of SIZE structs.And then uses it as if it held 2 * SIZE structs. Boom.
>
--
Chuck F (cbfalconer at maineline dot net)
Available for consulting/temporary embedded and systems.
<http://cbfalconer.home.att.net>
Closed Thread