Diskuze: malloc v scanf

C++ C a C++ malloc v scanf

Avatar
František Pastorek:

Dobrý deň,

mám problém s uvoľnením pointra. Ide o to, že najskôr si deklarujem pointer na char teda string. Potom načítam z klávesnice text a uložím ho do vytvoreného stringu s tym, že v scanf mallocujem potrebnu veľkosť pamäte. Presne toľko koľko potrebujem. So stringom viem pracovať ako s poľom teda napr. operacia[n], viem ho vypisat, pretože pri scanf sa na koniec mallocuje aj zapise koncovy znak. Žiaden problém. Ale. Keď chcem uvolniť pamäť tak mi program vypíše chybu.

Zdrojak:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
        char *operacia; //funguje
        scanf("%s", operacia = (char*)malloc(sizeof(char))); //funguje
        printf("\n%s", operacia); //funguje
        free(operacia); //nefunguje
        getch();
        return 0;
}

Chyba:

Debug Error!
HEAP CORRUPTION DETECTED: after Normal block(#63) at 0x004F7B00.
CRT detected that the application wrote to memory after end of heap buffer.

Nevie niekto prečo? Aj pri debugu, keď som sledoval stav stringu operacia, tak sa tam správne zapísal vstup. Prosím, vie mi niekto pomôcť? Vopred ďakujem.

 
Odpovědět 27.11.2015 10:18
Avatar
Libor Šimo (libcosenior):

Mne ten kód nevypisuje pri kompilovaní žiadnu chybu (Code:Blocks), ale nebude chyba v tom, že alokuješ málo pamäti?

scanf("%s", operacia = (char*)malloc(sizeof(char))); //funguje

alokuje len veľkosť 1 x sizof(char), ale ty do reťazsca môžeš vložiť viac znakov...

Nahoru Odpovědět 27.11.2015 11:43
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
František Pastorek:

Pri kompilovaní ani mne ale keď mam program spustený, zadám retazec a ked ho chce program uvolnit v tedy vyhodi chybovu hlasku. Ano. Je mi jasne ze iba jeden znak sa pri tom zapise alokuje, ALE ako to ze s tym retazcom viem dalej pracovat nie ako s jednym ale ako s poctom ktory reprezentuje pocet znakov zadaneho retazca.

 
Nahoru Odpovědět 27.11.2015 14:03
Avatar
Libor Šimo (libcosenior):

Myslim, ze zasahujes do nealokovanej pamati. Skus ju alokovat dostatocne velku, ci aj vtedy vyhodi chybu.

Nahoru Odpovědět 27.11.2015 14:54
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Milan Křepelka
Redaktor
Avatar
Milan Křepelka:

C nedělám, ale myslím, že problém je v %s. string je znak a ukončovaví znak \0. Tudíž ti to o jednu nevyjde. Má tam být %c, tak není co řešit.

 
Nahoru Odpovědět  ±0 27.11.2015 21:56
Avatar
Libor Šimo (libcosenior):

%c načíta 1 znak, nie string, ktorý potrebuje.

Nahoru Odpovědět 28.11.2015 7:16
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Kód by mohol vyzerať asi takto:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
        char *operacia; //funguje
        operacia = (char*) malloc(81 * sizeof(char)); // vyčlenenie potrebného miesta v pamati
        if (operacia == NULL) {
            printf("Malo pamati!\n");
            return 1;
        }
        /** aby mohol použiť aj biele znaky a ukončiť reťazec znakom '\n' */
        scanf(" %80[^\n]s", operacia); //funguje
        /** --------------------------------------------------------------*/
        printf("\n%s", operacia); //funguje
        free(operacia); //funguje
        getch();
        return 0;
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět  +1 28.11.2015 7:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

/** aby mohol použiť aj biele znaky a ukončiť reťazec znakom '\n' */
Sorry, nie ukončiť reťazec, ale ukončiť zadávanie reťazca ...

Nahoru Odpovědět 28.11.2015 7:31
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
František Pastorek:

ok. Dakujem

 
Nahoru Odpovědět 28.11.2015 9:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.