poate realoca Array, apoi De ce să folosiți indicii?

Acesta a fost un interviu de plasare a locurilor de muncă cu care m-am confruntat Au întrebat dacă putem realoca Array, i-am spus da. Apoi au întrebat - atunci de ce avem nevoie de pointeri deoarece majoritatea oamenilor dau motive pentru a pierde spațiul de memorie. Nu am putut da un răspuns satisfăcător. Dacă un organism poate da un răspuns satisfăcător, voi fi obligat. Vă rugăm să menționați orice situație în care declarația de mai sus poate contrazice.

Mulțumesc.

2

4 răspunsuri

Puteți numai să realocați o matrice care a fost alocată dinamic. Dacă a fost alocată în mod static, nu poate fi realocată [în siguranță]. *

Indicatorii păstrează adresele datelor din memorie. Acestea pot fi alocate, dealocate și realocate dinamic utilizând operatorii noi/ștergători în C ++ și malloc/free în C.

V-aș sugera să citiți Limba de programare C de Kernighan și Ritchie și un text solid C ++ ca C ++ de la Ground Up de Herbert Schildt.

Utilizarea memoriei dinamice, indicii, offseturi etc. sunt fundamentale pentru utilizarea acestor două limbi. Nu știți cum funcționează și de ce există acestea va fi un motiv probabil pentru angajatorii potențiali care vă vor dezamăgi.

* compilatorul nu ar trebui să vă permită să realocați tot ce a fost alocat în mod static, dar dacă se întâmplă acest lucru, comportamentul este nedefinit

8
adăugat
Nu i-am văzut standardul C adnotat - așa că nu pot să comentez direct, dar am folosit cartea Ground Up în orele de curs și am găsit pe studenți să-i "primească" cu textul respectiv
adăugat autor warren, sursa
Este C ++ al lui Schildt mai bun decât "standardul adnotat C"?
adăugat autor Jonathan Leffler, sursa

Expresia este un pic ciudat, dar pentru mine se pare că întrebarea pentru interviu a fost o întrebare deschisă, menită să vă facă să explicați ce știți despre arrayuri, indicatori, alocarea dinamică a memoriei etc. Dacă aș fi fost intervievatorul aș vrea candidatul să articuleze diferențele dintre int * a = malloc (10 * sizeof (int)); și int a [10]; Întrebarea de urmărire nu este formulată foarte bine, dar probabil a fost o încercare de a lovi candidatul în direcția diferenței dintre un pointer și o matrice și de a pune în mișcare gândul.

5
adăugat

O.K. Nu puteți realoca o matrice declarată static. Scopul utilizării indicatoarelor (în loc de matricea declarată static) ar fi ca să puteți realoca spațiul. Cred că, pentru a fi corect din punct de vedere tehnic, ați putea realoca o matrice definită static prin trecerea unui indicator la ea, dar nu aș vrea. Comportamentul este nedefinit dacă indicatorul este în memorie care nu a fost alocată de malloc.

2
adăugat
Funcția realloc ne permite să mărim sau să micșorim dimensiunea unei suprafețe alocate anterior (cea mai obișnuită utilizare este de a mări o zonă.) De exemplu, dacă alocăm spațiu pentru 512 elemente într-un matrice pe care o completăm în timpul execuției, dar găsim că avem nevoie de mai mult de 512 de elemente, putem apela realloc.
adăugat autor iankits, sursa
linux.die.net/man/3/realloc - tot nu va ajuta cu articolele alocate static
adăugat autor warren, sursa

Nu înțeleg cu adevărat cum folosirea indicatorilor "pierde memoria". Funcția realloc: -

void *realloc(void *ptr, size_t size);

ia un pointer în memorie pentru a redimensiona ca parametru. De asemenea, există mult mai multe utilizări pentru pointeri decât memoria dinamică, care trece prin referință, de exemplu.

1
adăugat
"deșeuri de memorie" ar putea fi intenționat să însemne că int * ra = malloc (10 * sizeof (int)); conduce la utilizarea mai multor stocări decât int ra [10]; din cauza cheltuielilor aferente implementării malloc. Dar există motive mai bune pentru a folosi arrays pe stiva unde este cazul.
adăugat autor Steve Jessop, sursa
Atunci când matricea aparține unui element reprezentat de struct, există memoria evidentă "deșeu" care stochează un pointer la matrice, mai degrabă decât încorporând matricea în struct și accesând numele de membru, folosește un extra sizeof *) octeți.
adăugat autor Steve Jessop, sursa