NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: malloc v scanf

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
František Pastorek:27.11.2015 10:18

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):27.11.2015 11:43

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:27.11.2015 14:03

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):27.11.2015 14:54

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
Tvůrce
Avatar
Milan Křepelka:27.11.2015 21:56

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
27.11.2015 21:56
Avatar
Libor Šimo (libcosenior):28.11.2015 7:16

%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):28.11.2015 7:26

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í
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.11.2015 7:26
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):28.11.2015 7:31

/** 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:28.11.2015 9:43

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.