joanna.ludmila@googlemail.com :
Mam strukturę:
typedef struct stringBufferStruct {
char *textS;
/* ... */
} stringBuffer;
Deklaracja funkcji:
void stringBufferAppend(stringBuffer* buffer, char* text);
Wiem już na pewno, że buffor jest inicjowany prawidłowo i że zmienna tekstowa jest przekazywana prawidłowo, ALE na tym fragmencie program się sypie:
strcpy(newItem->textS, text);
Podczas wykonywania programu dostaję komunikat: Naruszenie ochrony pamięci
. I koniec.
Jakieś wskazówki? Bo ja już przeczytałam cały DevHelp w temacie kopiowania stringów i nic. Czyżby przeszkadzało mu to, że to jest struktura? Jeśli tak, to jak inaczej wsadzić text do newItem->textS???
ok ale to jest wskażnik raczej, albo się nie znam ? :) Zaalokuj pamięc może i spróbuj ponownie :>
Pokaż jak allokujesz newItem->textS. Bo allokacja samej struktury stringBuffer nic nie da.
A w ogóle, to najlepiej daj sobie spokój z C, jesli tylko możesz. ;-)
Jest tyle piękniejszych, prostrzych i mniej zdradliwych języków. Chociażby Python.
Się robi:
To robi ta funkcja:
stringBuffer* newStringBuffer() {
stringBuffer *new;
if ((new = (stringBuffer *) malloc(sizeof(stringBuffer))) != NULL) {
new->next = NULL;
new->previous = NULL;
new->textS = "something\0";
printf("New list initialised! \n");
return new;
}
else {
fprintf(stderr,"ERROR: Out of memory!");
exit(-1);
}
}
A tu jest wywołana:
void stringBufferAppend(stringBuffer* buffer, char* text) {
stringBuffer *newItem = NULL;
if (isEmpty(buffer)) {
fprintf(stderr,"ERROR: Stack is empty!");
exit(-1);
}
else {
while (buffer->next != NULL) {
buffer = buffer->next;
}
newItem = newStringBuffer();
printf("text : %s : %d characters \n",text,strlen(text));
printf("textS : %s : %d characters \n",newItem->textS,strlen(newItem->textS));
strcpy(newItem->textS, text);
printf("Copying... [OK]!");
/* printf("%d \n", newItem->textS=="\0");
printf("%s \n",text);
printf("%s \n",newItem->textS);*/
buffer->next = newItem;
newItem->previous = buffer;
}
}
Wykomentowane fragmenty miały służyć znalezieniu mojego błędu :)
Jak chcę zaliczyć w końcu (powtarzam już) ten semestr to kiedyś muszę...
Wyłączyłam emotikony, bo się źle wyświetlał kod :)
Czyli o ile dobrze widzę, to pole textS inicjalizujesz tak:
new->textS = "something\0";
A więc stałą znakową o długości 10 bajtów, a dokładniej adresem stałej tablicy 10 bajtów.
A potem chcesz tam pisać... to nie może działać. Po pierwsze stałej, jak sama nazwa wskazuje, nie można modyfikować. Po drugie, 10 bajtów może nie starczyć na tekst który chcesz tam wpisać.
Najlepiej, przed wywołaniem strcpy() zaallokowac pamięc:
newItem->textS = malloc(strlen(text)+1);
Wczesniej warto by sprawdzić czy nie była już zaalokowana i jeśli tak, to zwolnić.
something to był tylko test, tam powinno być pewnie jakieś NULL albo "\0".
Zaraz sprawdzę, czy działa.
Raczej NULL, jako znacznik, że textS nie zostało jeszcze zaallokowane. "\0" to byłoby już całkiem bez sensu.
Ołje, wiedziałam, że mogę na Was liczyć! Dzięki Jajcuś i Najeli! Już oczywiście są następne schody, ale spróbuję po nich sama wejść. :)
DZIĘKI!
Nie ma to jak inne oczy niż moje. Nie wiedziałam, że tak trzeba robić.
każdy element struktury trzeba zaalokować osobno, oprócz struktyury trzeba więc zaaklokować pamięc na tekst :> To tyle...
oj nie odświeżyłem :) sorki :) spać już pora :)
PS. Dobrze by bylo gdybys uzyla strdup (Kuni sie ucieszy:). Powodzenia
widzialam tez jeszcze funkcje strdupa... ladne nazwy powymyslali