/ 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
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
char * vs void *
Fra : Kent Friis


Dato : 07-04-08 18:27

Jeg havde lige en bug, hvor jeg havde brugt
p+=sizeof(struct inotify_event), hvor p er en pointer til en
struct inotify_event. Det holder jo ikke, + på en pointer lægger
ikke et antal bytes til positionen, men et antal elementer.

Så kunne man jo bruge p+=1, men da netop den struct er en
variabel størrelse (den indeholder en char[]), går den ikke,
det skal være sizeof der skal lægges til.

Og så var det jeg kom til at tænke på, hvad er egentlig mest
korrekt - at erklære p som en char * eller som en void *? Hvad
er forskellen, når den alligevel skal cast'es til en
struct inotify_event bagefter?

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

 
 
Bertel Brander (07-04-2008)
Kommentar
Fra : Bertel Brander


Dato : 07-04-08 18:54

Kent Friis skrev:
> Jeg havde lige en bug, hvor jeg havde brugt
> p+=sizeof(struct inotify_event), hvor p er en pointer til en
> struct inotify_event. Det holder jo ikke, + på en pointer lægger
> ikke et antal bytes til positionen, men et antal elementer.
>
> Så kunne man jo bruge p+=1, men da netop den struct er en
> variabel størrelse (den indeholder en char[]), går den ikke,
> det skal være sizeof der skal lægges til.

Jeg har meget svært ved at se at det skulle gøre nogen
forskel at struct'en indeholder en char[]


> Og så var det jeg kom til at tænke på, hvad er egentlig mest
> korrekt - at erklære p som en char * eller som en void *? Hvad
> er forskellen, når den alligevel skal cast'es til en
> struct inotify_event bagefter?

Man kan ikke lave beregninger på en void *
DVS man kan ikke lægge sizeof(whatever) til en void *
Så hvis du har brug for det, skal p være en char *
På den anden side bruger man netop void * til generiske
pointere.

Kent Friis (07-04-2008)
Kommentar
Fra : Kent Friis


Dato : 07-04-08 19:14

Den Mon, 07 Apr 2008 19:54:20 +0200 skrev Bertel Brander:
> Kent Friis skrev:
>> Jeg havde lige en bug, hvor jeg havde brugt
>> p+=sizeof(struct inotify_event), hvor p er en pointer til en
>> struct inotify_event. Det holder jo ikke, + på en pointer lægger
>> ikke et antal bytes til positionen, men et antal elementer.
>>
>> Så kunne man jo bruge p+=1, men da netop den struct er en
>> variabel størrelse (den indeholder en char[]), går den ikke,
>> det skal være sizeof der skal lægges til.
>
> Jeg har meget svært ved at se at det skulle gøre nogen
> forskel at struct'en indeholder en char[]

Et char array af ukendt størrelse.

Og for at være helt præcis, er det sizeof struct inotify_event+p->len
der skal lægges til.

>> Og så var det jeg kom til at tænke på, hvad er egentlig mest
>> korrekt - at erklære p som en char * eller som en void *? Hvad
>> er forskellen, når den alligevel skal cast'es til en
>> struct inotify_event bagefter?
>
> Man kan ikke lave beregninger på en void *
> DVS man kan ikke lægge sizeof(whatever) til en void *
> Så hvis du har brug for det, skal p være en char *

Ah, ja så er der jo ikke noget at diskutere.

> På den anden side bruger man netop void * til generiske
> pointere.

Det var jo det jeg tænkte.

Det må så betyde at funktioner som memcpy der bruger void * cast'er
dem om til char * internt, for at kunne gå videre til næste byte.

(Hvis vi lige ser bort fra at de nok bruger en 32- eller 64-bit
størrelse pga. hastigheden).

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Bertel Brander (07-04-2008)
Kommentar
Fra : Bertel Brander


Dato : 07-04-08 19:21

Kent Friis skrev:
> Den Mon, 07 Apr 2008 19:54:20 +0200 skrev Bertel Brander:
>> Kent Friis skrev:
>>> Jeg havde lige en bug, hvor jeg havde brugt
>>> p+=sizeof(struct inotify_event), hvor p er en pointer til en
>>> struct inotify_event. Det holder jo ikke, + på en pointer lægger
>>> ikke et antal bytes til positionen, men et antal elementer.
>>>
>>> Så kunne man jo bruge p+=1, men da netop den struct er en
>>> variabel størrelse (den indeholder en char[]), går den ikke,
>>> det skal være sizeof der skal lægges til.
>> Jeg har meget svært ved at se at det skulle gøre nogen
>> forskel at struct'en indeholder en char[]
>
> Et char array af ukendt størrelse.
>
> Og for at være helt præcis, er det sizeof struct inotify_event+p->len
> der skal lægges til.

Ok.

>>> Og så var det jeg kom til at tænke på, hvad er egentlig mest
>>> korrekt - at erklære p som en char * eller som en void *? Hvad
>>> er forskellen, når den alligevel skal cast'es til en
>>> struct inotify_event bagefter?
>> Man kan ikke lave beregninger på en void *
>> DVS man kan ikke lægge sizeof(whatever) til en void *
>> Så hvis du har brug for det, skal p være en char *
>
> Ah, ja så er der jo ikke noget at diskutere.

>> På den anden side bruger man netop void * til generiske
>> pointere.
>
> Det var jo det jeg tænkte.

Ude i virkeligheden er der sjældent én løsning der
er optimal på alle måder.

> Det må så betyde at funktioner som memcpy der bruger void * cast'er
> dem om til char * internt, for at kunne gå videre til næste byte.
>
> (Hvis vi lige ser bort fra at de nok bruger en 32- eller 64-bit
> størrelse pga. hastigheden).

Den der har lavet compileren ved (eller bør vide) hvordan man
kopierer mest optimalt, herunder om det er muligt at bruge 32
eller 64 bits kopiering. Hvis man skulle lave en portabel
memcpy i C eller C++ var man nødt til at caste til en char*

Kent Friis (07-04-2008)
Kommentar
Fra : Kent Friis


Dato : 07-04-08 19:25

Den Mon, 07 Apr 2008 20:20:41 +0200 skrev Bertel Brander:
> Kent Friis skrev:
>> Det må så betyde at funktioner som memcpy der bruger void * cast'er
>> dem om til char * internt, for at kunne gå videre til næste byte.
>>
>> (Hvis vi lige ser bort fra at de nok bruger en 32- eller 64-bit
>> størrelse pga. hastigheden).
>
> Den der har lavet compileren ved (eller bør vide) hvordan man
> kopierer mest optimalt, herunder om det er muligt at bruge 32
> eller 64 bits kopiering. Hvis man skulle lave en portabel
> memcpy i C eller C++ var man nødt til at caste til en char*

Tak.

Mvh
Kent
--
"So there I was surrounded by all these scary creatures
They were even scarier than what Microsoft call features"
- C64Mafia: Forbidden Forest (Don't Go Walking Slow).

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste