/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
Pointere til structs?
Fra : Paminu


Dato : 09-02-06 22:22

Jeg har denne simple struct:

typedef struct test
{
int x;
int y;
}container;

int main(void)
{
container pp;
pp.x = 33;
pp.y = 44;

container *cp
cp = pp; // DENNE LINIE GIVER EN FEJL!

}

Hvad kan det være sidste linie giver en fejl når cp netop er en pointer til
structs af typen container?

Hvis jeg i stedet laver cp[0] = pp; så kører det fint...

 
 
Mogens Hansen (09-02-2006)
Kommentar
Fra : Mogens Hansen


Dato : 09-02-06 22:26


"Paminu" <sdef@asd.com> wrote in message
news:dsgbsn$usv$1@news.net.uni-c.dk...

[8<8<8<]
> Hvad kan det være sidste linie giver en fejl når cp netop er en pointer
> til
> structs af typen container?

Det er compilerens statiske typecheck der påpeger en fejl.
Du prøver at tildele en variabel af typen "pointer til container" en værdi
af typen "container" - det går galt.
Du tage adressen af "pp":
cp = &pp;

>
> Hvis jeg i stedet laver cp[0] = pp; så kører det fint...

Nej - det kører ikke fint. Du har muligvis ikke opdaget at det forholder sig
sådan.
Det er undefined behaviour - en bombe der kan sprænge når som helst.

Læs grundigt på pointere inden du går videre.
Tag et kig på værktøjer som CodeGuard, Purify, BoundsChecker eller Valgrind.

Venlig hilsen

Mogens Hansen



Paminu (09-02-2006)
Kommentar
Fra : Paminu


Dato : 09-02-06 22:38

Mogens Hansen wrote:

>
> "Paminu" <sdef@asd.com> wrote in message
> news:dsgbsn$usv$1@news.net.uni-c.dk...
>
> [8<8<8<]
>> Hvad kan det være sidste linie giver en fejl når cp netop er en pointer
>> til
>> structs af typen container?
>
> Det er compilerens statiske typecheck der påpeger en fejl.
> Du prøver at tildele en variabel af typen "pointer til container" en værdi
> af typen "container" - det går galt.
> Du tage adressen af "pp":
> cp = &pp;
>
>>
>> Hvis jeg i stedet laver cp[0] = pp; så kører det fint...
>
> Nej - det kører ikke fint. Du har muligvis ikke opdaget at det forholder
> sig sådan.
> Det er undefined behaviour - en bombe der kan sprænge når som helst.

Fordi jeg ikke har allokeret pladsen med malloc først?

Kan jeg ødelægge noget sådan rigtigt på min computer (håber ikke det er et
kæmpe blondine spørgsmål)?

> Læs grundigt på pointere inden du går videre.
> Tag et kig på værktøjer som CodeGuard, Purify, BoundsChecker eller
> Valgrind.


Er pt begravet i bøger, men selvom jeg syntes jeg forstår det jeg læser er
det bare noget andet når man begynder at kode. Men mange tak for
anbefalingerne!

Kent Friis (09-02-2006)
Kommentar
Fra : Kent Friis


Dato : 09-02-06 22:55

Den Thu, 09 Feb 2006 22:38:29 +0100 skrev Paminu:
> Mogens Hansen wrote:
>
>>
>> "Paminu" <sdef@asd.com> wrote in message
>> news:dsgbsn$usv$1@news.net.uni-c.dk...
>>
>> [8<8<8<]
>>> Hvad kan det være sidste linie giver en fejl når cp netop er en pointer
>>> til
>>> structs af typen container?
>>
>> Det er compilerens statiske typecheck der påpeger en fejl.
>> Du prøver at tildele en variabel af typen "pointer til container" en værdi
>> af typen "container" - det går galt.
>> Du tage adressen af "pp":
>> cp = &pp;
>>
>>>
>>> Hvis jeg i stedet laver cp[0] = pp; så kører det fint...
>>
>> Nej - det kører ikke fint. Du har muligvis ikke opdaget at det forholder
>> sig sådan.
>> Det er undefined behaviour - en bombe der kan sprænge når som helst.
>
> Fordi jeg ikke har allokeret pladsen med malloc først?

Det havde du ikke i det program du postede. Men det forklarer hvorfor
dit program ikke crashede.

Hvis du vil sætte din pointer til at pege på en eksisterende
struct, skal du IKKE malloc'e først. Pointeren kan kun pege på en
ting ad gangen, enten det du malloc'ede, eller pp.

Og husk at kalde free() lige så mange gange som malloc. Det vil
sige inden du ændrer pointeren til at pege på noget andet - for når
du først har ændret den, er der ikke længere noget der peger på
det du malloc'ede.

> Kan jeg ødelægge noget sådan rigtigt på min computer (håber ikke det er et
> kæmpe blondine spørgsmål)?

Under et moderne OS ville jeg sige nej. Ikke medmindre du er ovre i
noget driver-programmering, eller til nød som root. Men du kan, hvis
du er tilstrækkelig uheldig - slette alle de filer du har adgang til
at slette.

Når C-standarden siger "udefineret", betyder det at den tillader alt
lige fra at programmet virker til at der falder en jumbojet ned oven i
huset - og selvom det virker på din PC idag, kan der sagtens ske noget
helt andet på naboens, eller i morgen. Men compileren er stadig
begrænset af OS'et (medmindre du kører DOS, den begrænser ikke noget).

>> Læs grundigt på pointere inden du går videre.
>> Tag et kig på værktøjer som CodeGuard, Purify, BoundsChecker eller
>> Valgrind.
>
> Er pt begravet i bøger, men selvom jeg syntes jeg forstår det jeg læser er
> det bare noget andet når man begynder at kode. Men mange tak for
> anbefalingerne!

Pointere er altså ikke så svære som folk får dem til at lyde, man skal
bare lige vænne sig til at tænke på dem på den rigtige måde.

Og så slå alt hvad compileren har af warnings til, det tager de værste
hovsa'er

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Paminu (09-02-2006)
Kommentar
Fra : Paminu


Dato : 09-02-06 23:32

Kent Friis wrote:

> Den Thu, 09 Feb 2006 22:38:29 +0100 skrev Paminu:
>> Mogens Hansen wrote:
>>
>>>
>>> "Paminu" <sdef@asd.com> wrote in message
>>> news:dsgbsn$usv$1@news.net.uni-c.dk...
>>>
>>> [8<8<8<]
>>>> Hvad kan det være sidste linie giver en fejl når cp netop er en pointer
>>>> til
>>>> structs af typen container?
>>>
>>> Det er compilerens statiske typecheck der påpeger en fejl.
>>> Du prøver at tildele en variabel af typen "pointer til container" en
>>> værdi af typen "container" - det går galt.
>>> Du tage adressen af "pp":
>>> cp = &pp;
>>>
>>>>
>>>> Hvis jeg i stedet laver cp[0] = pp; så kører det fint...
>>>
>>> Nej - det kører ikke fint. Du har muligvis ikke opdaget at det forholder
>>> sig sådan.
>>> Det er undefined behaviour - en bombe der kan sprænge når som helst.
>>
>> Fordi jeg ikke har allokeret pladsen med malloc først?
>
> Det havde du ikke i det program du postede. Men det forklarer hvorfor
> dit program ikke crashede.
>
> Hvis du vil sætte din pointer til at pege på en eksisterende
> struct, skal du IKKE malloc'e først. Pointeren kan kun pege på en
> ting ad gangen, enten det du malloc'ede, eller pp.
>
> Og husk at kalde free() lige så mange gange som malloc. Det vil
> sige inden du ændrer pointeren til at pege på noget andet - for når
> du først har ændret den, er der ikke længere noget der peger på
> det du malloc'ede.
>
>> Kan jeg ødelægge noget sådan rigtigt på min computer (håber ikke det er
>> et kæmpe blondine spørgsmål)?
>
> Under et moderne OS ville jeg sige nej. Ikke medmindre du er ovre i
> noget driver-programmering, eller til nød som root. Men du kan, hvis
> du er tilstrækkelig uheldig - slette alle de filer du har adgang til
> at slette.
>
> Når C-standarden siger "udefineret", betyder det at den tillader alt
> lige fra at programmet virker til at der falder en jumbojet ned oven i
> huset - og selvom det virker på din PC idag, kan der sagtens ske noget
> helt andet på naboens, eller i morgen. Men compileren er stadig
> begrænset af OS'et (medmindre du kører DOS, den begrænser ikke noget).




>>> Læs grundigt på pointere inden du går videre.
>>> Tag et kig på værktøjer som CodeGuard, Purify, BoundsChecker eller
>>> Valgrind.
>>
>> Er pt begravet i bøger, men selvom jeg syntes jeg forstår det jeg læser
>> er det bare noget andet når man begynder at kode. Men mange tak for
>> anbefalingerne!
>
> Pointere er altså ikke så svære som folk får dem til at lyde, man skal
> bare lige vænne sig til at tænke på dem på den rigtige måde.

Hehe ja jeg begynder at holde lidt af dem, får med garanti nogle søde drømme
i nat

> Og så slå alt hvad compileren har af warnings til, det tager de værste
> hovsa'er

Tænker du på -Wall?

Kent Friis (09-02-2006)
Kommentar
Fra : Kent Friis


Dato : 09-02-06 23:41

Den Thu, 09 Feb 2006 23:31:50 +0100 skrev Paminu:
> Kent Friis wrote:
>
>> Og så slå alt hvad compileren har af warnings til, det tager de værste
>> hovsa'er
>
> Tænker du på -Wall?

Nu skrev du jo ikke noget om gcc (selvom jeg gættede på det, har
set dine indlæg i .unix), men ja. Og gerne kombineret med -O1,
gcc fanger ikke variable man har glemt at initialisere hvis ikke
man har den med.

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Kent Friis (09-02-2006)
Kommentar
Fra : Kent Friis


Dato : 09-02-06 22:31

Den Thu, 09 Feb 2006 22:21:36 +0100 skrev Paminu:
> Jeg har denne simple struct:
>
> typedef struct test
> {
> int x;
> int y;
> }container;
>
> int main(void)
> {
> container pp;
> pp.x = 33;
> pp.y = 44;
>
> container *cp
> cp = pp; // DENNE LINIE GIVER EN FEJL!
>
> }
>
> Hvad kan det være sidste linie giver en fejl når cp netop er en pointer til
> structs af typen container?

pp er en container.
cp er en pointer til en container.

Det du ønsker er:

cp = &pp;

Fordi:

&pp er en pointer til en container (en pointer til pp)
*cp er en container (nemlig den container som pp peger på).

> Hvis jeg i stedet laver cp[0] = pp; så kører det fint...

Det burde crashe... Det gør det modsatte af hvad du ønsker - det
kopierer værdien i stedet for at ændre pointeren, som peger ud
i den blå luft.

Mvh
Kent
--
Hard work may pay off in the long run, but laziness pays off right now.

Søg
Reklame
Statistik
Spørgsmål : 177429
Tips : 31962
Nyheder : 719565
Indlæg : 6407950
Brugere : 218878

Månedens bedste
Årets bedste
Sidste års bedste