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:
char *message;
{ ... }
free(message);
...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:
void notify(char *gdType, int sFound)
{
if (sFound == 1)
printf("%s\\n\\nSB_STATUS: sb_status is NOT present!", gdType);
}