Realloc w c++

0

Cześć
Jestem początkujący w c++ i mam problem z dynamiczna alokacja pamięci, mianowicie robie wszystko tak jak w książkach i poradnikach jest napisane a jednak nie działa tak jak bym oczekiwał.
Mianowicie program służy do wczytywania wyrazu i zapisywanie go w dopasowanej tablicy, i jak przy pierwszym wczytaniu wszystko jest ok to z każdym kolejnym dzieją sie dzwine rzeczy, a dokładnie gdy wpisze mniej liter niz poprzednio czasem dopisze mi to co było wcześniej.
Potrafiłby ktos wytłumaczyć, lub nakierować co w tym programie sie dzieje co jest nie tak i jak powinno byc?
Juz siedzę nad tym kilka dni przeczytawszy i oglądnąwszy wiele poradników ale albo jestem odporny na wiedze albo w poradniki wszystkiego nie ukazuja.
Pewnie to pierwsze...

0

Pokaż ten kod co napisałeś.

0

a niszczysz? pokaż kod.

0

A sorki..

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

int main()
{  char* a;
   int i=0;

     while(1){
    fflush(stdin);

    a=(char*) malloc(sizeof*a);
    char b=NULL;
    i=0;
    while(b!='\n')
    {
        scanf("%c",&b);
        if(b!='\n')
        {
       // strcpy((a+i),&b);
        a[i]=b;
        
        i++;
        a=(char*)realloc(a, (i+1)*sizeof*a);
        }
    }
    cout<<a;
    cout<<endl<<"dlugosc tablicy: "<<strlen(a)<<endl;
delete[] a;

    cout<<"liczba wczytanych znakow: "<<i<<endl<<"rozmiar tablicy po uzyciu delete: "<<" "<<strlen(a)<<endl;


}
    return 0;
}
 
0

Przepisz to na jeden język...
delete jest dla new. ty masz użyć free

0

A to widocznie tu jest pomyłka, tak normalnie przy free działa tak samo.
Czy po uzyciu którego kolwiek z nich rozmiar tablicy nie powinien byc równy 0?

0

Ja bym jeszcze spróbował:

  1. wstawić spację przed %c w scanf
  2. przenieść fflusha przed scanf
0

Nietety nie pomogło, po zastosowaniu tego program nawet nic nie wypisuje.

0

Tak sie nie wczytuje - bo to 1) jest wolne 2) fragmentuje pamięć. Alokujesz bufor, zwiększasz go tylko, gdy zaczyna być za mały.

0

Aha, a to moze byc powodem wyrzucania róznych dziwnych smieci?
Czyli powinienem tutaj przykładowo zwiekszac rozmiar tablicy co 5 i sprawdzać czy nie jest za mała?

0

rozmiar początkowy tablicy dobiera się tak, aby prawdopodobieństwo realokacji było jak najmniejsze. Jeśli wyrazy w języku polskim to chyba jakieś 24 - 32 znaki wystarczą, jeśli niemiecki, to optowałbym przy 256. i zwiększać nie o jeden, tylko co najmniej o 16 znaków, albo drugie tyle. Ogólnie starać się realokacje robić jak najrzadziej. Podpowiem, że efektywniej będzie zamiast scanfa użyć fgets-a

0

A wiec spróbuje i tak.
A takie pytanie, czy to teoretycznie nie jest tak ze po uzyciu free powinienem miec zwolnioną pamiec, a wiec przy nastepnej petli tak jakby zaczynać z nową tablica?
Chodzi mi o to skad sie biorą te wartosci, czesto są to te które wczesniej wpisywałem.

0

Biorą się stąd, że free nie czyści pamięci, tylko zwalnia i w zależności od systemu może być ta pamięć różnie wykorzystana, lub jeśli nie trzeba akurat to nie, więc pod tym adresem może (ale nie musi) być to co było wcześniej wpisane, ale równie dobrze może być cokolwiek innego. Free (w uproszczeniu) informuje system - "ta pamięć już jest nie potrzebna - rób z nią co chcesz".

0

Aha czyli z tad wiem ze tą pamiec oddaje a w niej moze znajdowac sie cokolwiek w tym to co było. A jak to jest ze skoro w następnej petli znów mam malloc i znów przyporządkowuje część pamięci i znowu wpisuje wyraz, ale tym razem długość samej tablicy jest większa niż długość wyrazu

0

W c terminuje się tablicę 0 - funkcja wypisująca string wypisuje to co ma w pamięci aż do napotkania 0. a teraz pytanie - gdzie masz ustawiany koniec tablicy? Nie masz - toteż wypisać może to co masz wpisane, albo cokolwiek więcej.

0

Nie wiem czy do konca zrozumiałem, czyli powinienem wstawic zawsze jako ostatni element '0'?

0

Jeśli funkcja, której używasz tego nie gwarantuje (tak użyty scanf tego nie gwarantuje), to tak.

0

Wszystko działa tak jak należy. A wiec dzięki wielkie za pomoc i poświęcony czas :)

0

Jednak mam jeszcze mały problem nie zwiazany z realloc-iem ale nie chce zakladac juz nowego tematu, mianowicie chodzi o przypisywanie po przez metode klasy do zmiennej w polu prywatnym. Gdy próbuje przesłać tablice o rozmiarze do8 znaków jest ok powyżej 8 znaków wypisuje mi jakies przypadkowe znaki.
Wywołuje metode w ten sposób i nie wazne czy tablica imie bedzie statycznie zadeklarowana czy dynamicznie efekt jest ten sam.

Imie(imie); 

metoda imie wyglada tak:

 void Pracownik::Imie(char* nowe_imie)
{
    delete[] pszImie;

    pszImie= nowe_imie;



}

a wypisanie :

void Pracownik::Wypisz() const
{
    cout<<pszImie<<" "<<pszNazwisko<<" ";
    dataUrodzenia.Wypisz();

} 

deklaracja zmiennej pszImie:

char *pszImie; 

Z kąd ta bariera 8 znaków?

1 użytkowników online, w tym zalogowanych: 0, gości: 1