|
| String problem Fra : Dennis Taszarek Holm |
Dato : 12-11-03 12:42 |
|
Hej
Jeg har erklæret en string:
char *string;
som bruger undervejs i noget string concatinering .. Men problemet er at jeg
gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
her måde:
string = '';
Men går ikke..
Hvordan gør jeg så ...
MVH
Dennis T. Holm
| |
Christian B. Andrese~ (12-11-2003)
| Kommentar Fra : Christian B. Andrese~ |
Dato : 12-11-03 12:44 |
|
"Dennis Taszarek Holm" <dennis@contempt.dk> wrote in message
news:bot6as$de0$1@sunsite.dk...
> Hej
>
> Jeg har erklæret en string:
>
> char *string;
>
> som bruger undervejs i noget string concatinering .. Men problemet er at
jeg
> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
> her måde:
>
> string = '';
>
> Men går ikke..
>
> Hvordan gør jeg så ...
Vil string'en ikke opfattes som tom hvis:
string[0]=NULL; ??
--
mvh/rg. Christian
Påkører du klovbærende vildt, afmærk stedet
og ring til en fra Schweisshunderegistret:
http://www.schweiss.dk/ eller Falck: 70 10 20 30
| |
Martin Moller Peders~ (12-11-2003)
| Kommentar Fra : Martin Moller Peders~ |
Dato : 12-11-03 13:29 |
|
In <3fb21d49$0$30079$edfadb0f@dtext01.news.tele.dk> "Christian B. Andresen" <nobody@domain.country> writes:
>"Dennis Taszarek Holm" <dennis@contempt.dk> wrote in message
>news:bot6as$de0$1@sunsite.dk...
>> Hej
>>
>> Jeg har erklæret en string:
>>
>> char *string;
>>
>> som bruger undervejs i noget string concatinering .. Men problemet er at
>jeg
>> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
>> her måde:
>>
>> string = '';
>>
>> Men går ikke..
>>
>> Hvordan gør jeg så ...
>Vil string'en ikke opfattes som tom hvis:
>string[0]=NULL; ??
Dumt.
Det vil skabe memory-leak. Det er jo ikke java, det her.
/Martin
| |
Christian B. Andrese~ (12-11-2003)
| Kommentar Fra : Christian B. Andrese~ |
Dato : 12-11-03 13:54 |
|
"Martin Moller Pedersen" <tusk@daimi.au.dk> wrote in message
news:bot91s$eq2$1@news.net.uni-c.dk...
> In <3fb21d49$0$30079$edfadb0f@dtext01.news.tele.dk> "Christian B.
Andresen" <nobody@domain.country> writes:
>
>
> >"Dennis Taszarek Holm" <dennis@contempt.dk> wrote in message
> >news:bot6as$de0$1@sunsite.dk...
> >> Hej
> >>
> >> Jeg har erklæret en string:
> >>
> >> char *string;
> >>
> >> som bruger undervejs i noget string concatinering .. Men problemet er
at
> >jeg
> >> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på
denne
> >> her måde:
> >>
> >> string = '';
> >>
> >> Men går ikke..
> >>
> >> Hvordan gør jeg så ...
>
> >Vil string'en ikke opfattes som tom hvis:
>
> >string[0]=NULL; ??
>
> Dumt.
> Det vil skabe memory-leak. Det er jo ikke java, det her.
Jeg gav min svar udfra embedded C.
--
mvh/rg. Christian
Påkører du klovbærende vildt, afmærk stedet
og ring til en fra Schweisshunderegistret:
http://www.schweiss.dk/ eller Falck: 70 10 20 30
| |
Rasmus Christian Kaa~ (13-11-2003)
| Kommentar Fra : Rasmus Christian Kaa~ |
Dato : 13-11-03 12:38 |
|
>>>string[0]=NULL; ??
>>Dumt.
>>Det vil skabe memory-leak. Det er jo ikke java, det her.
> Jeg gav min svar udfra embedded C.
Vil det ikke også være en memory-leak i embedded C?
| |
Christian B. Andrese~ (13-11-2003)
| Kommentar Fra : Christian B. Andrese~ |
Dato : 13-11-03 12:49 |
|
"Rasmus Christian Kaae" <rasmusTOPHAT@3kings.dk> wrote in message
news:bovqg9$4sg$1@news.cybercity.dk...
> >>>string[0]=NULL; ??
> >>Dumt.
> >>Det vil skabe memory-leak. Det er jo ikke java, det her.
> > Jeg gav min svar udfra embedded C.
>
> Vil det ikke også være en memory-leak i embedded C?
Jeg havde ikke tænkt mig ordentligt, NULL skulle have være 0 eller '\0' som
nogle andre påpeger.
string[0]=0; eller string[0]='\0'; vil ikke frigive rammen, men vil dog
tømme (læs. strlen(string)=0) string.
--
mvh/rg. Christian
Påkører du klovbærende vildt, afmærk stedet
og ring til en fra Schweisshunderegistret:
http://www.schweiss.dk/ eller Falck: 70 10 20 30
| |
Mogens Hansen (13-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 13-11-03 19:41 |
|
"Rasmus Christian Kaae" <rasmusTOPHAT@3kings.dk> wrote in message
news:<bovqg9$4sg$1@news.cybercity.dk>...
> >>>string[0]=NULL; ??
> >>Dumt.
> >>Det vil skabe memory-leak. Det er jo ikke java, det her.
> > Jeg gav min svar udfra embedded C.
>
> Vil det ikke også være en memory-leak i embedded C?
>
Hvad menes der med "embedded C" ?
Jeg antager at det er hvad der formelt hedder "freestanding implementation"
(C Standarden §4).
Der er ikke nogen forskel på hvad der giver memory-leak på en "freestanding
implementation" (typisk et embedded system) og på en "hosted implementation"
(typisk noget i retningen af MS-Windows, Linux, Solaris).
Bemærk desuden at den nævnte konstruktion _aldrig_ i sig selv kan give
memory leak.
Dette gælder også hvis der var blevet brugt de mere rigtige konstruktioner
string[0] = '\0';
eller eventuelt
string[0] = 0;
Venlig hilsen
Mogens Hansen
| |
Rasmus Christian Kaa~ (14-11-2003)
| Kommentar Fra : Rasmus Christian Kaa~ |
Dato : 14-11-03 07:32 |
|
Mogens Hansen wrote:
>>>Jeg gav min svar udfra embedded C.
>>
>>Vil det ikke også være en memory-leak i embedded C?
>>
>
>
> Hvad menes der med "embedded C" ?
> Jeg antager at det er hvad der formelt hedder "freestanding implementation"
> (C Standarden §4).
>
> Der er ikke nogen forskel på hvad der giver memory-leak på en "freestanding
> implementation" (typisk et embedded system) og på en "hosted implementation"
> (typisk noget i retningen af MS-Windows, Linux, Solaris).
Min pointe med spørgsmålet var også hvordan kan sige noget ikke er et
memory-leak blot fordi man benytter sig af en anden
implementation/variant af C (medmindre ens C-variant implementerer
garbagecollection men ja, ok
| |
Mogens Hansen (12-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 12-11-03 16:52 |
|
"Martin Moller Pedersen" <tusk@daimi.au.dk> wrote in message
news:<bot91s$eq2$1@news.net.uni-c.dk>...
> In <3fb21d49$0$30079$edfadb0f@dtext01.news.tele.dk> "Christian B.
> Andresen" <nobody@domain.country> writes:
[8<8<8<]
> >string[0]=NULL; ??
>
> Dumt.
> Det vil skabe memory-leak. Det er jo ikke java, det her.
Det er der vist ikke belæg for at sige noget om på det foreliggende
grundlag.
Konstruktionen kan i sig selv under ingen omstændigheder føre til
memory-leak - på trods af den begrebsforvirring Per Abrahamsen har påpeget.
Venlig hilsen
Mogens Hansen
| |
Per Abrahamsen (12-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 12-11-03 14:34 |
|
"Christian B. Andresen" <nobody@domain.country> writes:
> Vil string'en ikke opfattes som tom hvis:
>
> string[0]=NULL; ??
Jeg vil kunne læse den kode hurtigere hvis der står
string[0] = '\0';
Ellers vil jeg være i tvivl om du ønskede at sætte pointeren string
til nil, eller første tegn i det array string peger på til ASCII NUL.
NULL er C's navn for nil, altså en pointer til ingenting.
'\0' er C's navn for ASCII NUL, altså det ASCII tegn med den numeriske
kode 0.
Som svar til Martin:
string[0] = '\0';
giver ikke nødvendigvis en memeory leak hvis string senere bliver
frigivet.
string = NULL;
vil derimod give en memory leak, hvis string ikke allerede er
frigivet, eller peger på noget lager som et andet subsystem har styr
over.
string[0] = NULL;
er begrebsforvirring, men hvis det ikke giver en fejl i den aktuelle
kompiler vil det have samme betydning som
string[0] = '\0';
altså ingen memory leak.
| |
Christian B. Andrese~ (12-11-2003)
| Kommentar Fra : Christian B. Andrese~ |
Dato : 12-11-03 14:46 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
news:rju159emo9.fsf@sheridan.dina.kvl.dk...
> "Christian B. Andresen" <nobody@domain.country> writes:
>
> > Vil string'en ikke opfattes som tom hvis:
> >
> > string[0]=NULL; ??
>
> Jeg vil kunne læse den kode hurtigere hvis der står
>
> string[0] = '\0';
>
> Ellers vil jeg være i tvivl om du ønskede at sætte pointeren string
> til nil, eller første tegn i det array string peger på til ASCII NUL.
>
> NULL er C's navn for nil, altså en pointer til ingenting.
>
> '\0' er C's navn for ASCII NUL, altså det ASCII tegn med den numeriske
> kode 0.
Du har ret, det burde selvfølgelig så være string[0]=0;
--
mvh/rg. Christian
Påkører du klovbærende vildt, afmærk stedet
og ring til en fra Schweisshunderegistret:
http://www.schweiss.dk/ eller Falck: 70 10 20 30
| |
Mogens Hansen (12-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 12-11-03 16:52 |
|
"Christian B. Andresen" <nobody@domain.country> wrote in message
news:3fb239a1$0$30079$edfadb0f@dtext01.news.tele.dk...
>
> "Per Abrahamsen" <abraham@dina.kvl.dk> wrote in message
> news:rju159emo9.fsf@sheridan.dina.kvl.dk...
[8<8<8<]
> > Jeg vil kunne læse den kode hurtigere hvis der står
> >
> > string[0] = '\0';
> >
> > Ellers vil jeg være i tvivl om du ønskede at sætte pointeren string
> > til nil, eller første tegn i det array string peger på til ASCII NUL.
> >
> > NULL er C's navn for nil, altså en pointer til ingenting.
> >
> > '\0' er C's navn for ASCII NUL, altså det ASCII tegn med den numeriske
> > kode 0.
>
> Du har ret, det burde selvfølgelig så være string[0]=0;
Bemærk at Per Abrahamsen forslog
string[0] = '\0';
hvilket normalt opfattes som den korrekte måde at skrive nul-termineringen
(Det er f.eks. sådan den er angivet i C og C++ Standarden), og ikke
string[0]=0;
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (12-11-2003)
| Kommentar Fra : Bertel Brander |
Dato : 12-11-03 23:41 |
|
Mogens Hansen wrote:
>
> Bemærk at Per Abrahamsen forslog
> string[0] = '\0';
>
> hvilket normalt opfattes som den korrekte måde at skrive nul-termineringen
> (Det er f.eks. sådan den er angivet i C og C++ Standarden), og ikke
> string[0]=0;
>
Der er så vidt jeg ved ingen forskel på de to former.
/b
| |
Mogens Hansen (13-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 13-11-03 06:26 |
|
"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:3fb2b5fa$0$69900$edfadb0f@dread12.news.tele.dk...
> Mogens Hansen wrote:
>
> >
> > Bemærk at Per Abrahamsen forslog
> > string[0] = '\0';
> >
> > hvilket normalt opfattes som den korrekte måde at skrive
nul-termineringen
> > (Det er f.eks. sådan den er angivet i C og C++ Standarden), og ikke
> > string[0]=0;
> >
>
> Der er så vidt jeg ved ingen forskel på de to former.
0 er en integer literal.
'\0' er en char literal.
Venlig hilsen
Mogens Hansen
| |
Christian B. Andrese~ (13-11-2003)
| Kommentar Fra : Christian B. Andrese~ |
Dato : 13-11-03 09:29 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:bov4jq$29pa$1@news.cybercity.dk...
>
> "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> news:3fb2b5fa$0$69900$edfadb0f@dread12.news.tele.dk...
> > Mogens Hansen wrote:
> >
> > >
> > > Bemærk at Per Abrahamsen forslog
> > > string[0] = '\0';
> > >
> > > hvilket normalt opfattes som den korrekte måde at skrive
> nul-termineringen
> > > (Det er f.eks. sådan den er angivet i C og C++ Standarden), og ikke
> > > string[0]=0;
> > >
> >
> > Der er så vidt jeg ved ingen forskel på de to former.
>
> 0 er en integer literal.
> '\0' er en char literal.
Det kommer vel helt an på compileren.
--
mvh/rg. Christian
Påkører du klovbærende vildt, afmærk stedet
og ring til en fra Schweisshunderegistret:
http://www.schweiss.dk/ eller Falck: 70 10 20 30
| |
Mogens Hansen (13-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 13-11-03 19:40 |
|
"Christian B. Andresen" <nobody@domain.country> wrote in message
news:<3fb3408a$0$30062$edfadb0f@dtext01.news.tele.dk>...
>
> "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
> news:bov4jq$29pa$1@news.cybercity.dk...
> >
> > "Bertel Brander" <bertel@post4.tele.dk> wrote in message
> > news:3fb2b5fa$0$69900$edfadb0f@dread12.news.tele.dk...
[8<8<8<]
> > > Der er så vidt jeg ved ingen forskel på de to former.
> >
> > 0 er en integer literal.
> > '\0' er en char literal.
>
> Det kommer vel helt an på compileren.
Nej (bortset fra fejl i compileren).
Det kommer an på sproget.
I C++ er
0
en "Integer literal", således som det er beskrevet i C++ Standarden §2.13.1,
og
'\0'
er en "Character literal", således som det er beskrevet i C++ Standarden
§2.13.3
I C er
0
en "Integer constant", således som det er beskrevet i C Standarden §6.4.4.1
'\0'
er en "Character constant", således som det er beskrevet i C Standarden
§6.4.4.4.
Bemærk iøvrigt kommentaren i C Standarden §6.4.4.4-12
<citat>
EXAMPLE 1 The construction '\0' is commonly used to represent the null
character.
<citat/>
Venlig hilsen
Mogens Hansen
| |
Michael aka Slowhand (22-11-2003)
| Kommentar Fra : Michael aka Slowhand |
Dato : 22-11-03 00:18 |
|
>
> [8<8<8<]
> > > Jeg vil kunne læse den kode hurtigere hvis der står
> > >
> > > string[0] = '\0';
> > >
> > > Ellers vil jeg være i tvivl om du ønskede at sætte pointeren string
> > > til nil, eller første tegn i det array string peger på til ASCII NUL.
> > >
> > > NULL er C's navn for nil, altså en pointer til ingenting.
> > >
> > > '\0' er C's navn for ASCII NUL, altså det ASCII tegn med den numeriske
> > > kode 0.
> >
> > Du har ret, det burde selvfølgelig så være string[0]=0;
>
> Bemærk at Per Abrahamsen forslog
> string[0] = '\0';
>
> hvilket normalt opfattes som den korrekte måde at skrive nul-termineringen
> (Det er f.eks. sådan den er angivet i C og C++ Standarden), og ikke
> string[0]=0;
>
> Venlig hilsen
>
> Mogens Hansen
>
>
Skulle den termineres?
Jeg forstod på spørgsmålet at den skulle tømmes!?
| |
Per Abrahamsen (13-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 13-11-03 12:09 |
|
"Christian B. Andresen" <nobody@domain.country> writes:
> "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
> news:bov4jq$29pa$1@news.cybercity.dk...
>
>> 0 er en integer literal.
>> '\0' er en char literal.
>
> Det kommer vel helt an på compileren.
Nej, det er en del af sproget. Men effekten vil i det aktuelle
eksempel være den samme i C, og 0 er her en almindelig måde at skrive
strengafsluningstegnet på. Det vil ikke lede til den samme forvirring
hos læseren som NULL gør. Men '\0' er mere præcist, og specielt i C++
er det en god ide at vænne sig til altid at skelne fordi man kan få
forskellige overloadede funktioner alt efter om man kalder dem med en
char eller en int.
| |
Lasse Westh-Nielsen (13-11-2003)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 13-11-03 13:23 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> wrote:
> Nej, det er en del af sproget. Men effekten vil i det aktuelle
> eksempel være den samme i C, og 0 er her en almindelig måde at skrive
> strengafsluningstegnet på. Det vil ikke lede til den samme forvirring
> hos læseren som NULL gør. Men '\0' er mere præcist, og specielt i C++
> er det en god ide at vænne sig til altid at skelne fordi man kan få
> forskellige overloadede funktioner alt efter om man kalder dem med en
> char eller en int.
Apropos forvirring, jeg synes det giver stor klarhed helt at ignorere
NULL-makroen, og altid bruge 0 istedet.
I og med NULL bare er en makro, og at den ikke har nogen reel betydning for
semantikken af mit program, så mener jeg den bare skaber forvirring.
C er primitivt, og der er ingen grund til at bilde sig selv ind det ikke er
ved at definere NULL = 0, TRUE = 1, FALSE = 0 osv.
- Lasse
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Anders J. Munch (13-11-2003)
| Kommentar Fra : Anders J. Munch |
Dato : 13-11-03 14:52 |
|
"Lasse Westh-Nielsen" <lasse@daimi.au.dk> wrote:
>
> Apropos forvirring, jeg synes det giver stor klarhed helt at ignorere
> NULL-makroen, og altid bruge 0 istedet.
>
> I og med NULL bare er en makro, og at den ikke har nogen reel betydning for
> semantikken af mit program, så mener jeg den bare skaber forvirring.
Uenig. En C implementation kan definere NULL ved
#define NULL ((void*)0)
og derved give bedre typecheck end det flertydige 0 tillader.
En C++ implementation kan vælge at give en warning hvis man bruger
NULL for dens talværdi. Det gør gcc for eksempel.
mvh. Anders
| |
Per Abrahamsen (13-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 13-11-03 12:16 |
|
Per Abrahamsen <abraham@dina.kvl.dk> writes:
> "Christian B. Andresen" <nobody@domain.country> writes:
>
>> "Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
>> news:bov4jq$29pa$1@news.cybercity.dk...
>>
>>> 0 er en integer literal.
>>> '\0' er en char literal.
>>
>> Det kommer vel helt an på compileren.
>
> Nej, det er en del af sproget.
Hvilket er korrekt, men det kommer som Byrial minder mig om an på
hvilket sprog vi taler om. I C++ gælder Mogens udsagn.
I C vil jeg stadig mene at '\0' er bedst fordi det bedre udtrykker
hvad man mener, og er en god vane at have hvis man engang skal
programmere i C++.
| |
Per Abrahamsen (13-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 13-11-03 15:34 |
|
"Anders J. Munch" <andersjm@dancontrol.dk> writes:
> Uenig. En C implementation kan definere NULL ved
>
> #define NULL ((void*)0)
>
> og derved give bedre typecheck end det flertydige 0 tillader.
>
> En C++ implementation kan vælge at give en warning hvis man bruger
> NULL for dens talværdi. Det gør gcc for eksempel.
Hvis jeg husker ret er NULL defineret som __null i GCC, så GCC har
faktisk allerede det nøjleord jeg efterlyser.
| |
Byrial Jensen (13-11-2003)
| Kommentar Fra : Byrial Jensen |
Dato : 13-11-03 19:53 |
|
Per Abrahamsen wrote:
> Hvis jeg husker ret er NULL defineret som __null i GCC, så GCC har
> faktisk allerede det nøjleord jeg efterlyser.
Et blik i GCC's <stddef.h>/<cstddef> afslører at NULL defineres
som __null i C++programmer og som ((void *)0) i C-programmer.
| |
Bertel Brander (13-11-2003)
| Kommentar Fra : Bertel Brander |
Dato : 13-11-03 22:08 |
|
Byrial Jensen wrote:
> Per Abrahamsen wrote:
>
>> Hvis jeg husker ret er NULL defineret som __null i GCC, så GCC har
>> faktisk allerede det nøjleord jeg efterlyser.
>
>
> Et blik i GCC's <stddef.h>/<cstddef> afslører at NULL defineres
> som __null i C++programmer og som ((void *)0) i C-programmer.
>
Det er lidt tilfældigt at det blev dette spørgsmål jeg svarede på,
men...
Er det ikke lidt underligt at der kan komme ca 30 indlæg om hvorvidt
det er best at terminere en streng med 0 eller '\0', hvorimod der
kommer 0 indlæg til et fornuftigt spørgsmål om singleton's
(Christian Larsen 30/10)
/b
| |
Per Abrahamsen (13-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 13-11-03 15:37 |
|
"Lasse Westh-Nielsen" <lasse@daimi.au.dk> writes:
> Apropos forvirring, jeg synes det giver stor klarhed helt at ignorere
> NULL-makroen, og altid bruge 0 istedet.
Jeg er uenig, jeg ønsker at min kode skal udtrykke hvad jeg mener med
koden, ikke blot hvad den gør. Det gør det lettere for folk at finde
fejl.
> C er primitivt,
Ikke helt så primitivt, der er ingen garanti i sproget for at nil
pointeren er representeret med samme bit-mønster som int 0. At man
kan bruge samme symbol for int "0" og nil er bare en semantisk
overloading, ligesom at for eksempel "static" også har flere
forskellige betydninger i C.
Det er symbolet 0 der representerer nil, ikke tallet 0.
int i = 0;
char* p = i;
er en fejl.
> og der er ingen grund til at bilde sig selv ind det ikke er ved at
> definere NULL = 0, TRUE = 1, FALSE = 0 osv.
true og false er nu også en del af C99, defineret i <stdbool.h>.
Jeg så også gerne at nil blev tilføjet som nøjleord i C++ (jeg er ret
ligeglad med C), de samme argumenter som gave bool/true/false i C++ ,
nemlig at det var simplere med en definition i sproget i stedet for et
par hundrede rundt omkring i forskellige inkludefiler, burde også
gælde her.
| |
Byrial Jensen (13-11-2003)
| Kommentar Fra : Byrial Jensen |
Dato : 13-11-03 20:07 |
|
Per Abrahamsen wrote:
> Det er symbolet 0 der representerer nil, ikke tallet 0.
Det er nu ikke kun symbolet 0, men enhver "integer constant
expression" med værdien 0 som kan repræsentere nil.
> int i = 0;
> char* p = i;
>
> er en fejl.
Ja, men
char *p = (45 / 5) - 9;
er korrekt (men selvfølgelig tåbeligt).
| |
Per Abrahamsen (14-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 14-11-03 11:45 |
|
Bertel Brander <bertel@post4.tele.dk> writes:
> Er det ikke lidt underligt at der kan komme ca 30 indlæg om hvorvidt
> det er best at terminere en streng med 0 eller '\0', hvorimod der
> kommer 0 indlæg til et fornuftigt spørgsmål om singleton's
> (Christian Larsen 30/10)
Usenet er bedst til trivia.
| |
Per Abrahamsen (23-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 23-11-03 18:18 |
|
"Michael aka Slowhand" <noden@sol.dk> writes:
> Skulle den termineres?
> Jeg forstod på spørgsmålet at den skulle tømmes!?
En tom streng er en streng der er "termineret" efter 0 tegn.
Så det er to sider af samme sag.
| |
Jesper Sørensen (12-11-2003)
| Kommentar Fra : Jesper Sørensen |
Dato : 12-11-03 13:19 |
|
Dennis Taszarek Holm wrote:
> Hej
>
> Jeg har erklæret en string:
>
> char *string;
>
> som bruger undervejs i noget string concatinering .. Men problemet er at jeg
> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
> her måde:
>
> string = '';
>
> Men går ikke..
>
> Hvordan gør jeg så ...
>
> MVH
> Dennis T. Holm
>
>
prøv med:
string = ""; //da '' bruges ved tegn og ikke strenge
mvh
JS
| |
Martin Moller Peders~ (12-11-2003)
| Kommentar Fra : Martin Moller Peders~ |
Dato : 12-11-03 13:29 |
|
In <bot8gl$1u0k$3@gnd.k-net.dk> =?ISO-8859-1?Q?Jesper_S=F8rensen?= <s961595@XXXstudent.dtu.dk> writes:
>Dennis Taszarek Holm wrote:
>> Hej
>>
>> Jeg har erklæret en string:
>>
>> char *string;
>>
>> som bruger undervejs i noget string concatinering .. Men problemet er at jeg
>> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
>> her måde:
>>
>> string = '';
>>
>> Men går ikke..
>>
>> Hvordan gør jeg så ...
>>
>> MVH
>> Dennis T. Holm
>>
>>
>prøv med:
>string = ""; //da '' bruges ved tegn og ikke strenge
Dumt, det vil skabe memory leak.
/Martin
| |
Jesper Sørensen (12-11-2003)
| Kommentar Fra : Jesper Sørensen |
Dato : 12-11-03 13:37 |
|
Martin Moller Pedersen wrote:
> In <bot8gl$1u0k$3@gnd.k-net.dk> =?ISO-8859-1?Q?Jesper_S=F8rensen?= <s961595@XXXstudent.dtu.dk> writes:
>
>
>>Dennis Taszarek Holm wrote:
>
>
>>>Hej
>>>
>>>Jeg har erklæret en string:
>>>
>>>char *string;
>>>
>>>som bruger undervejs i noget string concatinering .. Men problemet er at jeg
>>>gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
>>>her måde:
>>>
>>>string = '';
>>>
>>>Men går ikke..
>>>
>>>Hvordan gør jeg så ...
>>>
>>>MVH
>>>Dennis T. Holm
>>>
>>>
>>
>>prøv med:
>
>
>>string = ""; //da '' bruges ved tegn og ikke strenge
>
>
> Dumt, det vil skabe memory leak.
>
> /Martin
>
>
Nu sagde han jo tømme og ikke slette, desuden går jeg da ud fra at han
har allokeret den hukommelse han bruger. Han skriver jo at han har
concateneret til de store guldmedalje.
mvh
JS
| |
Mogens Hansen (12-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 12-11-03 16:52 |
|
"Martin Moller Pedersen" <tusk@daimi.au.dk> wrote in message
news:<bot939$eqg$1@news.net.uni-c.dk>...
[8<8<8<]
> >string = ""; //da '' bruges ved tegn og ikke strenge
>
> Dumt, det vil skabe memory leak.
Det er der ikke belæg for at sige på det foreliggende grundlag.
Konstruktionen _kan_ under visse forhold (string peger på noget dynamisk
allokeret og der findes ikke andre pointere til den hukommelses blok) føre
til memory leak, men den medfører det ikke automatisk memory leak.
Venlig hilsen
Mogens Hansen
| |
Michael aka Slowhand (22-11-2003)
| Kommentar Fra : Michael aka Slowhand |
Dato : 22-11-03 00:37 |
|
"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:botkte$b2r$2@news.cybercity.dk...
> "Martin Moller Pedersen" <tusk@daimi.au.dk> wrote in message
> news:<bot939$eqg$1@news.net.uni-c.dk>...
>
> [8<8<8<]
> > >string = ""; //da '' bruges ved tegn og ikke strenge
> >
> > Dumt, det vil skabe memory leak.
>
> Det er der ikke belæg for at sige på det foreliggende grundlag.
> Konstruktionen _kan_ under visse forhold (string peger på noget dynamisk
> allokeret og der findes ikke andre pointere til den hukommelses blok) føre
> til memory leak, men den medfører det ikke automatisk memory leak.
>
> Venlig hilsen
>
> Mogens Hansen
>
>
Det er rigtigt.
Det er underordnet hvad han kommer i strengen.
Det er kun leak hvis den ikke bliver nedlagt ordentligt.
Det ville være dumt at sige at det leaker hvis han senere i koden giver den
en anden værdi!
Bare den ikke leaker når programmet terminerer hvis den er global eller når
funktionen returnerer hvis den er lokal!
| |
Per Abrahamsen (23-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 23-11-03 18:28 |
|
"Michael aka Slowhand" <noden@sol.dk> writes:
> Det er underordnet hvad han kommer i strengen.
> Det er kun leak hvis den ikke bliver nedlagt ordentligt.
>
> Det ville være dumt at sige at det leaker hvis han senere i koden giver den
> en anden værdi!
Om han senere i koden giver string en anden værdi eller ej har ingen
indflydelse på hvorvidt der er tale om en memory leak.
Leaken afhænger af det stykke memory string tidligere pegede på,
specifikt om der er "noget andet" end variablen string der holder styr
på det. Hvis der *ikke* er det *vil* string = "" give en memory leak,
uanset hvad vi senere gør.
"Noget andet" kan være en anden variabel, eller run-time systemet selv
hvis det stykke memory er statisk, placeret i stakken, eller i et
stykke heap kontroleret af en garbage collector.
Det er ikke variable der skal frigives, men hukommelse.
Eksempel:
void f ()
{
void* x = malloc (100);
void* y;
y = x;
free (y);
}
Der er ingen leak i f selvom "x" aldrig bliver frigivet, for den stump
hukommelse x peger på bliver nemlig frigivet i kaldt "free (y)".
| |
Kent Friis (23-11-2003)
| Kommentar Fra : Kent Friis |
Dato : 23-11-03 18:32 |
|
Den Sun, 23 Nov 2003 18:28:18 +0100 skrev Per Abrahamsen:
>"Michael aka Slowhand" <noden@sol.dk> writes:
>
>> Det er underordnet hvad han kommer i strengen.
>> Det er kun leak hvis den ikke bliver nedlagt ordentligt.
>>
>> Det ville være dumt at sige at det leaker hvis han senere i koden giver den
>> en anden værdi!
>
>Om han senere i koden giver string en anden værdi eller ej har ingen
>indflydelse på hvorvidt der er tale om en memory leak.
>
>Leaken afhænger af det stykke memory string tidligere pegede på,
>specifikt om der er "noget andet" end variablen string der holder styr
>på det. Hvis der *ikke* er det *vil* string = "" give en memory leak,
>uanset hvad vi senere gør.
Her er der ikke noget andet der holder styr på det string peger på:
char * string;
string=malloc(200);
/* do something */
free(string);
/* later... */
string = ""; /* Ikke en memory leak */
Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/
| |
Michael aka Slowhand (23-11-2003)
| Kommentar Fra : Michael aka Slowhand |
Dato : 23-11-03 22:13 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> skrev i en meddelelse
news:rjk75ruh8t.fsf@sheridan.dina.kvl.dk...
> "Michael aka Slowhand" <noden@sol.dk> writes:
>
> > Det er underordnet hvad han kommer i strengen.
> > Det er kun leak hvis den ikke bliver nedlagt ordentligt.
> >
> > Det ville være dumt at sige at det leaker hvis han senere i koden giver
den
> > en anden værdi!
>
> Om han senere i koden giver string en anden værdi eller ej har ingen
> indflydelse på hvorvidt der er tale om en memory leak.
>
> Leaken afhænger af det stykke memory string tidligere pegede på,
> specifikt om der er "noget andet" end variablen string der holder styr
> på det. Hvis der *ikke* er det *vil* string = "" give en memory leak,
> uanset hvad vi senere gør.
>
> "Noget andet" kan være en anden variabel, eller run-time systemet selv
> hvis det stykke memory er statisk, placeret i stakken, eller i et
> stykke heap kontroleret af en garbage collector.
>
> Det er ikke variable der skal frigives, men hukommelse.
>
> Eksempel:
>
> void f ()
> {
> void* x = malloc (100);
> void* y;
>
> y = x;
> free (y);
> }
>
>
> Der er ingen leak i f selvom "x" aldrig bliver frigivet, for den stump
> hukommelse x peger på bliver nemlig frigivet i kaldt "free (y)".
Hehe!
i må gerne rette mig hvis jeg tager fejl.
Faktisk havde han bare lavet en pointer til en char.
Om du sætter den til "" eller '' eller '\0' har det desværre ikke noget med
memoryleak at gøre.
han tlideler den bare en væredi!
Selvgølgelig hvis han ændrer adressen, (&) er der måske noget om snakken!
Så vil jeg lige nævne at en string altid er termineret, ellers er det pr.
term et array ac chars...!
| |
Kent Friis (23-11-2003)
| Kommentar Fra : Kent Friis |
Dato : 23-11-03 22:47 |
|
Den Sun, 23 Nov 2003 22:12:46 +0100 skrev Michael aka Slowhand:
>
>Hehe!
>i må gerne rette mig hvis jeg tager fejl.
>Faktisk havde han bare lavet en pointer til en char.
>Om du sætter den til "" eller '' eller '\0' har det desværre ikke noget med
>memoryleak at gøre.
>han tlideler den bare en væredi!
>Selvgølgelig hvis han ændrer adressen, (&) er der måske noget om snakken!
>Så vil jeg lige nævne at en string altid er termineret, ellers er det pr.
>term et array ac chars...!
Hvis du har en variabel "char * string", og du sætter det til:
string="" - så ændrer du pointeren. Hvis den pegede på noget der var
malloc()'et, skal du sørge for at free() det.
string='' - kan ikke lade sig gøre. ' indikerer en char, og en char
indeholder altid noget.
string='\0' - fejl, char array = char.
*string='\0' - string får længden 0, og er under normale forhold tom.
Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/
| |
Zodiaz12 (24-11-2003)
| Kommentar Fra : Zodiaz12 |
Dato : 24-11-03 13:00 |
|
"Kent Friis" <leeloo@phreaker.net> skrev i en meddelelse
news:bpr9t1$n6l$1@sunsite.dk...
> Den Sun, 23 Nov 2003 22:12:46 +0100 skrev Michael aka Slowhand:
> >
> >Hehe!
> >i må gerne rette mig hvis jeg tager fejl.
> >Faktisk havde han bare lavet en pointer til en char.
> >Om du sætter den til "" eller '' eller '\0' har det desværre ikke noget
med
> >memoryleak at gøre.
> >han tlideler den bare en væredi!
> >Selvgølgelig hvis han ændrer adressen, (&) er der måske noget om snakken!
> >Så vil jeg lige nævne at en string altid er termineret, ellers er det pr.
> >term et array ac chars...!
>
> Hvis du har en variabel "char * string", og du sætter det til:
>
> string="" - så ændrer du pointeren. Hvis den pegede på noget der var
> malloc()'et, skal du sørge for at free() det.
>
> string='' - kan ikke lade sig gøre. ' indikerer en char, og en char
> indeholder altid noget.
>
> string='\0' - fejl, char array = char.
>
> *string='\0' - string får længden 0, og er under normale forhold tom.
>
Det lyder rigtigt.. Men han har jo heller ikke brugt malloc eller new!
(Sorry for mine tastefejl tidligere)
| |
Byrial Jensen (25-11-2003)
| Kommentar Fra : Byrial Jensen |
Dato : 25-11-03 21:58 |
|
Kent Friis wrote:
>Hvis du har en variabel "char * string", og du sætter det til:
>
>string='\0' - fejl, char array = char.
Ja, det er en logisk fejl at tildele en tegnkonstant til en pointer,
men det er ikke en programfejl som kan fanges af en oversætter
da koden formelt set er korrekt. Tegnkonstanten '\0' har nemlig
værdien 0 som er en lovlig værdi at tildele en pointer.
(Muligvis kan nogle oversættere sættes til at advare mod
konstruktionen).
| |
Zodiaz12 (24-11-2003)
| Kommentar Fra : Zodiaz12 |
Dato : 24-11-03 12:59 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> skrev i en meddelelse
news:rjk75ruh8t.fsf@sheridan.dina.kvl.dk...
> "Michael aka Slowhand" <noden@sol.dk> writes:
>
> > Det er underordnet hvad han kommer i strengen.
> > Det er kun leak hvis den ikke bliver nedlagt ordentligt.
> >
> > Det ville være dumt at sige at det leaker hvis han senere i koden giver
den
> > en anden værdi!
>
> Om han senere i koden giver string en anden værdi eller ej har ingen
> indflydelse på hvorvidt der er tale om en memory leak.
>
> Leaken afhænger af det stykke memory string tidligere pegede på,
> specifikt om der er "noget andet" end variablen string der holder styr
> på det. Hvis der *ikke* er det *vil* string = "" give en memory leak,
> uanset hvad vi senere gør.
>
> "Noget andet" kan være en anden variabel, eller run-time systemet selv
> hvis det stykke memory er statisk, placeret i stakken, eller i et
> stykke heap kontroleret af en garbage collector.
>
> Det er ikke variable der skal frigives, men hukommelse.
>
> Eksempel:
>
> void f ()
> {
> void* x = malloc (100);
> void* y;
>
> y = x;
> free (y);
> }
>
>
> Der er ingen leak i f selvom "x" aldrig bliver frigivet, for den stump
> hukommelse x peger på bliver nemlig frigivet i kaldt "free (y)".
Ja, det har du så ret i!
Skal lige have gang i hjernen!
| |
Per Abrahamsen (23-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 23-11-03 19:17 |
|
leeloo@phreaker.net (Kent Friis) writes:
> Her er der ikke noget andet der holder styr på det string peger på:
Der skulle gerne være et eller andet subsystem der holdt styr på at
det var markeret fri og derfor kan genanvendes.
| |
Kent Friis (23-11-2003)
| Kommentar Fra : Kent Friis |
Dato : 23-11-03 21:11 |
|
Den Sun, 23 Nov 2003 19:16:30 +0100 skrev Per Abrahamsen:
>leeloo@phreaker.net (Kent Friis) writes:
>
>> Her er der ikke noget andet der holder styr på det string peger på:
>
>Der skulle gerne være et eller andet subsystem der holdt styr på at
>det var markeret fri og derfor kan genanvendes.
Er det ikke nemmere at holde styr på hvad der er i brug?
Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/
| |
Per Abrahamsen (24-11-2003)
| Kommentar Fra : Per Abrahamsen |
Dato : 24-11-03 12:50 |
|
"Michael aka Slowhand" <noden@sol.dk> writes:
> Faktisk havde han bare lavet en pointer til en char.
> Om du sætter den til "" eller '' eller '\0' har det desværre ikke noget med
> memoryleak at gøre.
> han tlideler den bare en væredi!
Det er vigtigt at gøre sig klart om det er pointeren der bliver
ændret, eller det som pointeren peger på der bliver ændret.
> Selvgølgelig hvis han ændrer adressen, (&) er der måske noget om snakken!
Man kan ikke ændre på adresserne af hverken variable eller værdier.
Men du kan få pointere til at pege på andre adresser.
| |
Zodiaz12 (24-11-2003)
| Kommentar Fra : Zodiaz12 |
Dato : 24-11-03 13:11 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> skrev i en meddelelse
news:rjekvy7zpr.fsf@sheridan.dina.kvl.dk...
> "Michael aka Slowhand" <noden@sol.dk> writes:
>
> > Faktisk havde han bare lavet en pointer til en char.
> > Om du sætter den til "" eller '' eller '\0' har det desværre ikke noget
med
> > memoryleak at gøre.
> > han tlideler den bare en væredi!
>
> Det er vigtigt at gøre sig klart om det er pointeren der bliver
> ændret, eller det som pointeren peger på der bliver ændret.
>
> > Selvgølgelig hvis han ændrer adressen, (&) er der måske noget om
snakken!
>
> Man kan ikke ændre på adresserne af hverken variable eller værdier.
> Men du kan få pointere til at pege på andre adresser.
Jep, det var nu også det jeg mente!
| |
Martin Moller Peders~ (12-11-2003)
| Kommentar Fra : Martin Moller Peders~ |
Dato : 12-11-03 13:30 |
|
In <bot6as$de0$1@sunsite.dk> "Dennis Taszarek Holm" <dennis@contempt.dk> writes:
>Hej
>Jeg har erklæret en string:
>char *string;
Du har vel skaffe plads til at string kan indeholde noget med
malloc ? Saa skal du bruge free(string).
Mvh
Martin
| |
Michael aka Slowhand (22-11-2003)
| Kommentar Fra : Michael aka Slowhand |
Dato : 22-11-03 00:39 |
|
"Martin Moller Pedersen" <tusk@daimi.au.dk> skrev i en meddelelse
news:bot94n$etk$1@news.net.uni-c.dk...
> In <bot6as$de0$1@sunsite.dk> "Dennis Taszarek Holm" <dennis@contempt.dk>
writes:
>
> >Hej
>
> >Jeg har erklæret en string:
>
> >char *string;
>
> Du har vel skaffe plads til at string kan indeholde noget med
> malloc ? Saa skal du bruge free(string).
>
> Mvh
> Martin
Nu sprøger jeg nok dumt men er malloc og free C og new/delete cpp?
New og delete er i hvert fald ansi, så meget ved jeg da! ;)
| |
Morten Boysen (22-11-2003)
| Kommentar Fra : Morten Boysen |
Dato : 22-11-03 21:52 |
|
"Michael aka Slowhand" <noden@sol.dk> skrev i en meddelelse
news:3fbea219$0$9798$edfadb0f@dread14.news.tele.dk...
> Nu sprøger jeg nok dumt men er malloc og free C og new/delete cpp?
Ja.
--
Morten Boysen
| |
Martin Moller Peders~ (12-11-2003)
| Kommentar Fra : Martin Moller Peders~ |
Dato : 12-11-03 13:31 |
|
In <bot6as$de0$1@sunsite.dk> "Dennis Taszarek Holm" <dennis@contempt.dk> writes:
>Hej
>Jeg har erklæret en string:
>char *string;
>som bruger undervejs i noget string concatinering .. Men problemet er at jeg
>gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
>her måde:
Hvis du programmerer i C++ og ikke C, saa burde du bruge String istedet for
char *
/Martin
| |
Mogens Hansen (12-11-2003)
| Kommentar Fra : Mogens Hansen |
Dato : 12-11-03 16:52 |
|
"Martin Moller Pedersen" <tusk@daimi.au.dk> wrote in message
news:<bot96f$eu0$1@news.net.uni-c.dk>...
[8<8<8<]
> Hvis du programmerer i C++ og ikke C, saa burde du bruge String
> istedet for char *
Mener du ikke "string" (altså med lille 's' - "std::string" fra C++ Standard
library) ?
Bortset fra det er det en god anbefaling at bruge string objekter i stedet
for char*.
Venlig hilsen
Mogens Hansen
| |
Bertel Brander (12-11-2003)
| Kommentar Fra : Bertel Brander |
Dato : 12-11-03 23:38 |
|
Dennis Taszarek Holm wrote:
> Hej
>
> Jeg har erklæret en string:
>
> char *string;
Der en nok nogen der vil sige at du har erklæret en variabel
af type pointer til char, og kaldt denne variabel string.
>
> som bruger undervejs i noget string concatinering .. Men problemet er at jeg
> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
> her måde:
>
> string = '';
>
> Men går ikke..
>
> Hvordan gør jeg så ...
' ' er karakteren mellerum og er af typen char(/int), string er af typen
pointer til char.
Man kan sætte string til at pege på NULL:
string = NULL;
Eller man kan sætte string til at pege på en tom streng:
string = "";
Eller sætte string til at pege på noget memory og sætte længden på
strengen til 0, ved at sætte den første karakter i det string peger
på til at være 0 (det samme som '\0').
char Whatever[10234];
string = Whatever;
string[0] = 0;
eller
*string = 0;
eller
Whatever[0] = 0;
Det er kun i det sidste tilfælde man kan ændre i det string peger på.
/b
PS: Det er ikke nogen god ide at kalde noget for string, du risikerer at
navnet koliderer med noget i kompileren.
| |
Byrial Jensen (13-11-2003)
| Kommentar Fra : Byrial Jensen |
Dato : 13-11-03 00:58 |
|
Bertel Brander wrote:
> ' ' er karakteren mellerum og er af typen char(/int)
For at være helt præcis, så er typen 'int' i C og 'char' i C++.
Det betyder som regel ikke noget, men forskellen ses i
nedenstående 2 programmer:
$ cat si.c
#include <stdio.h>
int main ()
{
printf ("sizeof (char) = %zu\n", sizeof (char));
printf ("sizeof (int) = %zu\n", sizeof (int));
printf ("sizeof ' ' = %zu\n", sizeof ' ');
}
$ gcc si.c
$ ./a.out
sizeof (char) = 1
sizeof (int) = 4
sizeof ' ' = 4
$ cat si.c++
#include <iostream>
using namespace std;
int main ()
{
cout << "sizeof (char) = " << sizeof (char) << endl;
cout << "sizeof (int) = " << sizeof (int) << endl;
cout << "sizeof ' ' = " << sizeof ' ' << endl;
}
$ g++ si.c++
$ ./a.out
sizeof (char) = 1
sizeof (int) = 4
sizeof ' ' = 1
| |
Michael aka Slowhand (22-11-2003)
| Kommentar Fra : Michael aka Slowhand |
Dato : 22-11-03 00:21 |
|
"Dennis Taszarek Holm" <dennis@contempt.dk> skrev i en meddelelse
news:bot6as$de0$1@sunsite.dk...
> Hej
>
> Jeg har erklæret en string:
>
> char *string;
>
> som bruger undervejs i noget string concatinering .. Men problemet er at
jeg
> gerne vil tømme min streng efter jeg har brugt den.. Prøvede det på denne
> her måde:
>
> string = '';
>
> Men går ikke..
>
> Hvordan gør jeg så ...
>
> MVH
> Dennis T. Holm
>
>
Din string bliver ikke tømt for snavs ved at terminere den men derfor er det
stadig en god idé at gøre det.
Du kan tømme den med memset(&string, 0, sizeof string)
Den fylder 0 i rammen fra adressen på string og så x antal bytes frem alt
efter størrelsen på strengen!
Den er ANSI!
| |
|
|