Strcat problem med char pointers

Tags:    c++

Jeg har rodet med dette problem i et godt stykke tid nu, og jeg er sikker på det "bare" er en lille selvfølgelig ting jeg har glemt. Koden giver mig "Unable to write to memory" error når den eksekveres. Problemet ligger i strcat, det virker fint med normale char arrays, men ikke med char pointers - hvorfor?

void notify(char *gdType, int sFound)
{
char *message;

if (sFound == 1)
{
message = (char*)malloc(sizeof(gdType)+sizeof("SB_STATUS: sb_status is present!")+1);
message = gdType;
strcat(message, "SB_STATUS: sb_status is present!");
printf("\\nString: %s", message");
}
free(message);
}



Indlæg senest redigeret d. 10.07.2006 20:19 af Bruger #10230
jeg har aldrig været en ørn til strenghåntering i C, men jeg kan da prøve...

mit umiddelbare bud er at du smidder den pointer du får fra malloc væk i og med at du siger:
message = gdType;

deudover allokerer du formodentlig heller ikke nok plads, da gdType er en pointer, og derfor formodentlig får strørrelsen af pointeren og ikke dataene. find antallet af karaktere i stregen med strlen og multiplicer med sizeof(char). Kopier indholdet af gdType til message med strcpy.

Jeg er som sagt ikke en ørn til strenghåntering i C, så det er med et lille forbehold.

håber det kan hjælpe dig.
//Troels



Problemet blev aldrig løst, sådan som jeg havde tænkt det, men fandt en omvej - nemlig sprintf.

sprintf(message, "%s\\n\\nSB_STATUS: sb_status is NOT present!, gdType");

Virker perfekt.

Ellers tak for hjælpen Troels:)



Jeg har rodet med dette problem i et godt stykke tid nu, og jeg er sikker på det "bare" er en lille selvfølgelig ting jeg har glemt. Koden giver mig "Unable to write to memory" error når den eksekveres. Problemet ligger i strcat, det virker fint med normale char arrays, men ikke med char pointers - hvorfor?

void notify(char *gdType, int sFound)
{
char *message;

if (sFound == 1)
{
message = (char*)malloc(sizeof(gdType)+sizeof("SB_STATUS: sb_status is present!")+1);
message = gdType;
strcat(message, "SB_STATUS: sb_status is present!");
printf("\\nString: %s", message");
}
free(message);
}


Hej Ole. Der er en del problemer i din kode. Den første er at du prøver og finde størrelsen på en streng ved hjælp af 'sizeof(gdType)'. Dette kan kun gøres på konstanter, som du selv gør med 'sizeof("SB_STATUS: sb_status is present!")', dette er lovligt fordi kompileren selv kan regne størrelsen ud under kompileringen. 'sizeof(gdType)' returnerer ikke størrelsen på strengen, men på typen 'char*', som er 4 byte på 32-bit computere og 8 byte på 64-bit computere. Istedet skal du bruge 'strlen(gdType)', som er lavet til netop dette formål.

Så er der 'message = gdType'. Her regner jeg med at du vil kopiere indholdet af gdType til message, men det du i virkeligheden gør er at tildele message gdType's addresse. Brug i stedet 'strcpy(message, gdType)'.

Sådan som du har brugt 'strcat(message, "SB_STATUS: sb_status is present!")' ville også skabe en del problemer selv om du havde gjort alt rigtigt indtil videre. Da message ikke er blevet nulstillet indeholder den med stor sandsynelighed bare tilfældige værdiger. strcat virker ved at finde null-terminatoren i strengen (slutningen på sætningen, givet ved et nul), men hvis der bare er tilfældige værdiger i message, kan den sagtens søge ud over det stykke hukomelse du har allokeret, for derefter at prøve og tilføje strengen, hvilket sikkert også er grunden til din fejlmeddelelse.

Til slut er der din 'free(message)', som er ude for skopet af hukomelsesallokeringen. Hvis sFound er lig med nul, bliver dit kode til:

Fold kodeboks ind/udKode 


...hvilket helt sikkert også vil give problemer. 'free(message)' skulle have stået efter din printf kommando.

Du kan omskrive dit kode til det følgende simplerer eksempel, og så behøver du heller ikke allokere noget hukomelse:
Fold kodeboks ind/udKode 




t