Article View: be.comp.programming
Article #15029Re: IA-32 Assembly: laden van een string
From: Melle Geers
Date: Sat, 18 Nov 2000 00:00
Date: Sat, 18 Nov 2000 00:00
72 lines
2775 bytes
2775 bytes
In nl.comp.programmeren Luc Kumps <NOkumpsSPAM@pandora.be> wrote:
> Hoe is deze string gedefinieerd?
> Als
> char szString[1000];
> of als
> char szString[] = "Dit is een constante string";
Dit komt, bijna, op hetzelfde neer.
Het levert allebei een array van char op met een bepaalde grootte,
waar je gewoon in kan schrijven.
Beide declaraties verschillen alleen wbt het aantal karakters wat
je kwijt kunt in szString.
De notatie:
T var[] = {elem1,...,elemn};
zorgt dat de compiler zelf het aantal
elementen van de initialisator telt en is gelijk aan de vorm:
T var[n] = {elem1,...,elemn};
waarbij n dus automagisch door de compiler wordt bepaald, aan
de hand van het aantal elementen.
Omdat "string" gelijk is aan {'s','t',...,'\0'} <1>,
betekent:
char szString[] = "mijn string";
dus hetzelfde als:
char szString[sizeof "mijn string"] = "mijn string";
oftewel:
char szString[12] = "mijn string";
> Misschien wordt er het tweede geval de string wel beschermd?
Dan is je compiler gaar :)
Maar waarschijnlijk heb je een typo gemaakt en bedoelde je, in je
tweede declaratie:
char *szString = "Dit is een constante string";
dan klopt het semantisch, qua inhoud van szString, weer :)
En in dit geval zal szString inderdaad wijzen naar geheugen waar
je niet in moet proberen te schrijven.
In C is een string literal altijd een object in read-only geheugen.
Preciezer: een array van char's, waarvoor de gewone regels gelden,
behalve dat je er niet overheen mag schrijven en de declaratie
in scope is (zodat sizeof werkt zoals verwacht).
Toch vind ik het raar dat dit alleen voor string's geldt. Het zou
mooier en veel consistenter zijn als je ook kon schrijven:
int *pI = {1, 2, 3};
int i;
i = pI[1];
bijvoorbeeld <2>.
Melle
<1> in de initialisatie
<2> dan zou voetnoot 1 ook niet nodig zijn
--
Entropy isn't what it used to be.
Technical Details
Message-ID:
<8v70v7$41t$1@news1.xs4all.nl>Path:
arc1-ca.pugleaf.net!unknown!not-for-mailReferences:
<8v3fb6$rt1$1@porthos.nl.uu.net> <974472582.884512@marvin> <8v3ilu$oo$1@porthos.nl.uu.net> <k9dR5.158572$iI2.3029519@afrodite.telenet-ops.be>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII-7-bit X-Google-Thread: 107324,6ae1fd2282496057 X-Google-Attributes: gid107324,public X-Google-Thread: fcea4,6ae1fd2282496057 X-Google-Attributes: gidfcea4,public From: Melle Geers <mgeers@xs4all.nl> Subject: Re: IA-32 Assembly: laden van een string Date: 2000/11/18 Message-ID: <8v70v7$41t$1@news1.xs4all.nl> X-Deja-AN: 695255238 References: <8v3fb6$rt1$1@porthos.nl.uu.net> <974472582.884512@marvin> <8v3ilu$oo$1@porthos.nl.uu.net> <k9dR5.158572$iI2.3029519@afrodite.telenet-ops.be> X-Complaints-To: abuse@xs4all.nl X-Windows: XFree86 X-Trace: news1.xs4all.nl 974587687 4157 194.109.6.44 (18 Nov 2000 22:48:07 GMT) Organization: XS4ALL Internet BV User-Agent: tin/pre-1.4-980514 (UNIX) (BSD/OS/4.0 (i386)) NNTP-Posting-Date: 18 Nov 2000 22:48:07 GMT Newsgroups: be.comp.programming,nl.comp.programmeren