Rozterki w C

14 komentarzy

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???


Komentarze do notki “Rozterki w C”

  1. AnKeL 

    ok ale to jest wskażnik raczej, albo się nie znam ? :) Zaalokuj pamięc może i spróbuj ponownie :>

  2. Jajcus 

    Pokaż jak allokujesz newItem->textS. Bo allokacja samej struktury stringBuffer nic nie da.

  3. Jajcus 

    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.

  4. Ja-Joanna 

    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 :)

  5. Ja-Joanna 

    Jak chcę zaliczyć w końcu (powtarzam już) ten semestr to kiedyś muszę...

  6. Ja-Joanna 

    Wyłączyłam emotikony, bo się źle wyświetlał kod :)

  7. Jajcus 

    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ć.

  8. Ja-Joanna 

    something to był tylko test, tam powinno być pewnie jakieś NULL albo "\0".

    Zaraz sprawdzę, czy działa.

  9. Jajcus 

    Raczej NULL, jako znacznik, że textS nie zostało jeszcze zaallokowane. "\0" to byłoby już całkiem bez sensu.

  10. Ja-Joanna 

    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ć.

  11. AnKeL 

    każdy element struktury trzeba zaalokować osobno, oprócz struktyury trzeba więc zaaklokować pamięc na tekst :> To tyle...

  12. AnKeL 

    oj nie odświeżyłem :) sorki :) spać już pora :)

  13. nikita 

    PS. Dobrze by bylo gdybys uzyla strdup (Kuni sie ucieszy:). Powodzenia

  14. Ja-Joanna 

    widzialam tez jeszcze funkcje strdupa... ladne nazwy powymyslali

Zostaw odpowiedź