473,327 Members | 2,012 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,327 software developers and data experts.

pointer to struct

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++;
}
}

Dec 6 '06 #1
14 2515
ls
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:
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++;
}

}
Dec 6 '06 #2
"povoação" <ok*****@gmail.comwrites:
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 <9s*****************@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.
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
Dec 6 '06 #3
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.

Dec 6 '06 #4
"ls@qustation.com" <ls******@gmail.comwrites:
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
Dec 6 '06 #5
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:
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 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.
}
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.
Dec 6 '06 #6
"povoação" <ok*****@gmail.comwrites:
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: bl*@cs.stanford.edu
web: http://benpfaff.org
Dec 6 '06 #7
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

Dec 6 '06 #8
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:
"povoação" <okle...@gmail.comwrites:
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
Dec 6 '06 #9
"povoação" <ok*****@gmail.comwrites:
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.
Dec 6 '06 #10
povoação wrote:
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>
Dec 6 '06 #11
On Dec 6, 4:10 pm, "matevzb" <mate...@gmail.comwrote:
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.
"povoação" <ok*****@gmail.comwrote in message
news:11**********************@80g2000cwy.googlegro ups.com...
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
Dec 6 '06 #12
Ben Pfaff <bl*@cs.stanford.eduwrites:
"povoação" <ok*****@gmail.comwrites:
>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) ks***@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.
Dec 6 '06 #13
Ben Pfaff wrote:
"ls@qustation.com" <ls******@gmail.comwrites:
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>
Dec 7 '06 #14
thanks all. Now works with pointers. Thanks for the tips too.

On Dec 6, 11:03 pm, CBFalconer <cbfalco...@yahoo.comwrote:
Ben Pfaff wrote:
"l...@qustation.com" <lsear...@gmail.comwrites:
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>
Dec 7 '06 #15

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

3
by: sathyashrayan | last post by:
The standard confirms that the following initialization of a struct struct node { --- --- } struct node var = {NULL};
10
by: Kieran Simkin | last post by:
Hi, I wonder if anyone can help me, I've been headscratching for a few hours over this. Basically, I've defined a struct called cache_object: struct cache_object { char hostname; char ipaddr;...
5
by: Danilo Kempf | last post by:
Folks, maybe one of you could be of help with this question: I've got a relatively portable application which I'm extending with a plugin interface. While portability (from a C perspective) is...
2
by: Immo Birnbaum | last post by:
Hi, I'm trying to solve a programming lab assignment for my college C programming course, but as they taught us two semesters of Java before teaching us any C, I'm having problems with all the...
4
by: JS | last post by:
I have a file called test.c. There I create a pointer to a pcb struct: struct pcb {   void *(*start_routine) (void *);   void *arg;   jmp_buf state;   int    stack; }; ...
10
by: junky_fellow | last post by:
K&R say that, It is guaranteed that 1) a pointer to an object may be converted to a pointer to an object whose type requires less or equally strict storage alignment and 2) back again without...
5
by: Johs32 | last post by:
I have a struct "my_struct" and a function that as argument takes a pointer to this struct: struct my_struct{ struct my_struct *new; }; void my_func(struct my_struct *new); I have read...
2
by: Chad | last post by:
The following question stems from the following thread on comp.lang.c: http://groups.google.com/group/comp.lang.c/browse_thread/thread/0ad03c96df57381a/5f20260b30952fe7?hl=en#5f20260b30952fe7 I...
12
by: gcary | last post by:
I am having trouble figuring out how to declare a pointer to an array of structures and initializing the pointer with a value. I've looked at older posts in this group, and tried a solution that...
2
by: Mike | last post by:
Hi, I am new to C and having problems with the following program. Basically I am trying to read some files, loading data structures into memory for latter searching. I am trying to use structres...
0
by: DolphinDB | last post by:
Tired of spending countless mintues downsampling your data? Look no further! In this article, you’ll learn how to efficiently downsample 6.48 billion high-frequency records to 61 million...
1
isladogs
by: isladogs | last post by:
The next Access Europe meeting will be on Wednesday 6 Mar 2024 starting at 18:00 UK time (6PM UTC) and finishing at about 19:15 (7.15PM). In this month's session, we are pleased to welcome back...
0
by: jfyes | last post by:
As a hardware engineer, after seeing that CEIWEI recently released a new tool for Modbus RTU Over TCP/UDP filtering and monitoring, I actively went to its official website to take a look. It turned...
0
by: ArrayDB | last post by:
The error message I've encountered is; ERROR:root:Error generating model response: exception: access violation writing 0x0000000000005140, which seems to be indicative of an access violation...
1
by: PapaRatzi | last post by:
Hello, I am teaching myself MS Access forms design and Visual Basic. I've created a table to capture a list of Top 30 singles and forms to capture new entries. The final step is a form (unbound)...
1
by: Defcon1945 | last post by:
I'm trying to learn Python using Pycharm but import shutil doesn't work
1
by: Shællîpôpï 09 | last post by:
If u are using a keypad phone, how do u turn on JavaScript, to access features like WhatsApp, Facebook, Instagram....
0
by: af34tf | last post by:
Hi Guys, I have a domain whose name is BytesLimited.com, and I want to sell it. Does anyone know about platforms that allow me to list my domain in auction for free. Thank you
0
isladogs
by: isladogs | last post by:
The next Access Europe User Group meeting will be on Wednesday 3 Apr 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM). In this session, we are pleased to welcome former...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.