Obszar zapisu statycznej tablicy w funckji

0

Witam
Znam pojęcią sztos oraz sterty. Wiem, że na sztosie lokowane są zmienne tworzone bez operatora new i ,że po wyjściu z bloku sztos jest zwijany do stanu przed wejściem do danego bloku.
Mam taki kod. ( Jest to kod odpowiedzialny za opakowywanie zmiennej imie w strukture typu Element ) Jest to fragment kodu z listy jednokierunkowej.

Element* getNewElement(){
    char tab[100];
    cin >> tab;
    char* dest = new char[strlen(tab)+1];
    strcpy(dest, tab);
    Element* e = new Element(); // Trzeba dac new zeby nie nadpisac przypadkowego obszaru pamieci
    e->imie = dest;
    e->next = 0;
    return e;
}

Jeśli zrobię tak

e->imie = tab;

To każdy element ma to samą nazwę co nowo wprowadzony.
Zastanawiam skąd to się bierze. Przychodzi mi na myśl wniosek, że zmienna tab wskazuje cały czas na ten sam obszar pamięci i dlatego w każdym obiekcie typu Element jest to samo imię.
Ale po wyjściu z bloku zmienna tab z tego co rozumiem powinna się skasować. Więc moje pytanie brzmi następująco. Skąd w każdym elemencie bierze się to samo imię ? Czy po skasowaniu zmiennej tab powstaje ona w tym samym obszarze pamięci o takim samym adresie ?

1

Jeśli nie umiesz jeszcze wskaźników uzyj zamiast char * std::stringa.

0

Załóżmy, że mamy funkcje:

void MyFunction3(int x, int y, int z)
{
  int a, int b, int c;
  ...
  return;
}

Kompilator zamieni to na kod asmeblera:

push z
push y
push x
_MyFunction3:
  push ebp
  mov ebp, esp
  sub esp, 12 ; sizeof(a) + sizeof(b) + sizeof(c) --alokacja pamięci na zmienne lokalne
  ;x = [ebp + 8], y = [ebp + 12], z = [ebp + 16]
  ;a = [ebp - 4] = [esp + 8], b = [ebp - 8] = [esp + 4], c = [ebp - 12] = [esp]
  mov esp, ebp
  pop ebp
  return;

https://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames
Pytanie czy po wyjściu z funkcji twoja tablica(ta na stosie) jest nadpisywana nowymi wywołaniami funkcji.

0

Mam teraz inne pytanie. Czy istnieje jakaś różnica między tym dwoma zapisami a jeśli tak to jaka .
Nazwa Klasa to obiekt typu Klasa z 3 polami składowymi.

Klasa g;
Klasa gg = Klasa();
0
Grzegorz Wawrzeniecki napisał(a):

Mam teraz inne pytanie. Czy istnieje jakaś różnica między tym dwoma zapisami a jeśli tak to jaka .
Nazwa Klasa to obiekt typu Klasa z 3 polami składowymi.

Klasa g;
Klasa gg = Klasa();

Klasa to chyba klasa, nie obiekt???

Według specyfikacji języka -- nie ma różnicy. Bez względu na to co jest w Klasie.

0
Klasa g; //stos
Klasa * gg = new Klasa(); //sterta
0

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