/ 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
C: problem m. sprintf
Fra : Hans Hvelplund Odbor~


Dato : 13-07-01 01:42

Er der nogen der kan forklare mig hvad jeg gør galt i følgende kode stump?
....
csWriteLink("1ID");
....
int csWriteLink(char *string)
{
char *checksumString;
char *completeString;
printf("Writing with cs.\n");
sprintf(checksumString,"\x02%s\x03",string); /*Her får jeg segment fejl*/
.....
}

 
 
Bertel Lund Hansen (12-07-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-07-01 20:10

Hans Hvelplund Odborg skrev:

>Er der nogen der kan forklare mig hvad jeg gør galt i følgende kode stump?

Har du allokeret hukommelse til de to pointere?

>...
> csWriteLink("1ID");
>...
>int csWriteLink(char *string)
>{
> char *checksumString;
> char *completeString;

checksumString = malloc (GodtMedHukommelse);
completeString = malloc (MasserAfHukommelse);

> printf("Writing with cs.\n");
> sprintf(checksumString,"\x02%s\x03",string); /*Her får jeg segment fejl*/
> .....
>}

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Richard Flamsholt (12-07-2001)
Kommentar
Fra : Richard Flamsholt


Dato : 12-07-01 21:25

Bertel Lund Hansen <nospamto@lundhansen.dk> skrev:
>Har du allokeret hukommelse til de to pointere?

(Teknisk detalje: svaret hertil er ja, for de to pointere er jo ganske
almindelige lokale variabler - men de *peger* ikke på noget allokeret
hukommelse.)

>>int csWriteLink(char *string)
>>{
>> char *checksumString;
>
> checksumString = malloc (GodtMedHukommelse);

Dårlig ide. Lad være med at gætte. Brug i stedet kendskabet til den
fornødne plads:

checksumString = malloc(strlen(string)+3); /* \2 string \3 \0 */

>> sprintf(checksumString,"\x02%s\x03",string); /*Her får jeg segment fejl*/

--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk

Anders Melchiorsen (12-07-2001)
Kommentar
Fra : Anders Melchiorsen


Dato : 12-07-01 22:41

Richard Flamsholt <richard@flamsholt.dk> skrev:

> > checksumString = malloc (GodtMedHukommelse);
>
> Dårlig ide. Lad være med at gætte. Brug i stedet kendskabet til den
> fornødne plads:
>
> checksumString = malloc(strlen(string)+3); /* \2 string \3 \0 */

Eller brug ellers i det mindste snprintf() til at sikre, at
GodtMedHukommelse rent faktisk var stor nok.

--
Regards, Anders

....if a Microsoft product fails, who do you sue?

Bertel Lund Hansen (12-07-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-07-01 23:18

Richard Flamsholt skrev:

>> checksumString = malloc (GodtMedHukommelse);

>Dårlig ide. Lad være med at gætte.

Helt enig. Jeg mente bare at de nærmere detaljer overlodes til
læseren, men det var selvfølgelig ikke skrevet så klart.

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Per Abrahamsen (23-07-2001)
Kommentar
Fra : Per Abrahamsen


Dato : 23-07-01 15:03

Richard Flamsholt <richard@flamsholt.dk> writes:

> checksumString = malloc(strlen(string)+3); /* \2 string \3 \0 */

Og husk at kalde

free (checksumString)

når du forlader funktionen, for at rydde op. Alternativt kan du
erklære checksumString således:

char checksumString[strlen (string) + 3];

Så sker oprydningen helt automatisk. Det kræver dog at din kompiler
er ny (eller GNU) nok, da ældre C versioner ikke understøtter
ovenstående.

Karl Krukow (12-07-2001)
Kommentar
Fra : Karl Krukow


Dato : 12-07-01 20:19

> Er der nogen der kan forklare mig hvad jeg gør galt i følgende kode stump?
> ...
> csWriteLink("1ID");
> ...
> int csWriteLink(char *string)
> {
> char *checksumString;
> char *completeString;
> printf("Writing with cs.\n");
> sprintf(checksumString,"\x02%s\x03",string); /*Her får jeg segment
fejl*/
> .....
> }

Som Bertel allerede har nævnt skal du huske at allokere hukommelse til dine
char * 's.
sprintf() og de andre strenge-manipulationskald allokerer ikke selv den
hukommelse der skal bruges. Da jeg kodede mit første C undrede det mig også,
men i længden er det klart bedre selv at styre hukommelses-allokeringer.




Byrial Jensen (22-07-2001)
Kommentar
Fra : Byrial Jensen


Dato : 22-07-01 08:03

Hans Hvelplund Odborg <hhod00@control.auc.dk> skrev:
> Er der nogen der kan forklare mig hvad jeg gør galt i følgende kode stump?
> ...
> csWriteLink("1ID");
> ...
> int csWriteLink(char *string)
> {
> char *checksumString;
> char *completeString;
> printf("Writing with cs.\n");
> sprintf(checksumString,"\x02%s\x03",string); /*Her får jeg segment fejl*/
> .....
> }

En anden ting (udover hvad andre allerede har nævnt) er at du burde
erklære string som "const char *". Det bør erklæres at funktionen
ikke ændrer hvad string peger på fordi:

- Det giver mere information til et menneske som læser koder og
prøver på at finde ud hvad der sker.

- Det forøger oversætteren muligheder for at komme med
fejlmeldninger hvis der alligevel rettes i konstante data.

- Det forøger oversætteren muligheder for optimeringer.

- Funktionen kaldes med en konstant streng som ikke må ændres.

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

Månedens bedste
Årets bedste
Sidste års bedste