Diskuze: malloc v scanf
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 9 zpráv z 9.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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...
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.
Myslim, ze zasahujes do nealokovanej pamati. Skus ju alokovat dostatocne velku, ci aj vtedy vyhodi chybu.
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.
%c načíta 1 znak, nie string, ktorý potrebuje.
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;
}
/** 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 ...
ok. Dakujem
Zobrazeno 9 zpráv z 9.