Wpis z mikrobloga

To

void rozmiar(char * tablica, size_t n_elementow, size_t n_elementow_nowe)_
_
{_
_
tablica=new char[n_elementow_nowe];_
_
for(int i=(n_elementow-1); i
tablica[i]=33;

}

int main()

{

char * test;

test = new char[6];

rozmiar(test, 6, 12);

}

powinno (przynajmniej wg. mnie :P) zwiększyć tablicę (do 12) i nowe elementy wypełnić 33 (czyli znakami wykrzykniku), ale po wyświetleniu mają 0. Co robię źle?

#programowanie #cpp

`
  • 31
@extern-int: właśnie (już pomijając to czy to jest poprawne, czy nie) jak będą tam jakieś elementy to one zostają po ponownym zaalokowaniu. No ale mój problem polega na tym, że tych które wpisze po zaalokowaniu jakby nie ma.
Co robię źle?


@psi-nos: Uƶywasz naked

new
/

delete
zamiast kontenerów.

Do tego przekazujesz wskaźnik przez wartość i z jakiegoś powodu spodziewasz się, ƶe zachowa się jak referencja do wskaźnika (zmiana wartości wskaźnika poprzez przypisywanie zaalokowanej pamięci)

Do tego nie zwalniasz pamięci.

Do tego Twoja funkcja w sposób kompletnie nieczytelny dla uƶytkownika (nie-) dealokuje pamięć i przypisuje (w zamierzeniu) nową.
@psi-nos: Pewnie empiryczny test też źle napisałeś. Nie zwalnia się kodu tylko tablice i w czym mają zostać? W starej tablicy elementy nie ulegają zmianie, ale gdy tworzysz nową to tracisz informacje o tym gdzie w pamięci była stara tablica.
@psi-nos: rzeczywiście jak dodam zwolninie przed drugą alakocją to działa. Czyli alakoacja nie działa tak, jak bym chciał, chociaż dziwne, że tamte stare elementy zostają. Może to druga alokacja po prostu nie zachodzi.
Do tego przekazujesz wskaźnik przez wartość i z jakiegoś powodu spodziewasz się, ƶe zachowa się jak referencja do wskaźnika (zmiana wartości wskaźnika poprzez przypisywanie zaalokowanej pamięci)


@KrzaQ2: ale to działa, jak dodałem zwolnienie pamięci. Nie rozumiem dokładnie o co ci chodzi. Podaję jako argument wskaźnik na pierwszy element tablicy.
@psi-nos:



void
```**```
 f(
```**```
int
```**```
 n)
``````
{
``````
    n = 3;
``````
}
```**```
int
```**```
 main()
``````
{
``````
    
```**```
int
```**```
 n = 5;
``````
    f(n);
``````
}import re
``````
def hello():
``````
    
```**```
return
```**```
 'Hello World'
``````
print hello()

Po wykonaniu funkcji f zmienna n nadal równa jest 5. Podobnie u ciebie wskaźnik nie ulega zmianie.
@psi-nos: To strasznie masz jak coś co de facto jest niepoprawnego, nieczytelnego, bliższego C musisz używać. Wg mnie na ćwiczeniach się powinno uczyć samodzielności, odkrywania nowszej technologii. To tak jak być w dzisiejszych czasach chciał pracować na Windows 3.11 mimo że jest 8.1.
@sylwke3100: Myślę, ƶe w akurat napisanie własnego kontenera na ćwiczeniach pod okiem prowadzącego ma sens: dzięki temu łatwiej zrozumieć jak działają wskaźniki, co jest problemem dla wielu osób. Chociaƶ nie pakowałbym tego w kurs dla początkujących, ale to inna sprawa.
@sylwke3100: ale przecież oprócz tego, że bez kontenerów, to jest to c++, bo chyba new i delete są z c++? A ćwiczenie polega właśnie na poznaniu budowy kontenera, więc jak inaczej mielibyśmy robić?