Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Ce fac cu malloc() si realloc() ?  (Citit de 3422 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
rEbyTer
Vorbaret
****

Karma: -85
Deconectat Deconectat

Mesaje: 154



Vezi Profilul
« : Octombrie 05, 2008, 14:30:12 »

Am scris un mic program si nu prea inteleg de ce functioneaza in anumite situatii. Spre exemplu am pornit de la
Cod:
#include <iostream>
#include <malloc.h>
#define SIZE 1000000000
using namespace std;

int main() {
char *a;int i;
a = (char *) malloc (SIZE * sizeof(char));
for (i=0; i<SIZE ; ++i) *(a+i)='a'+i;
//for (int i=0; i<100000 ; ++i) {cout<<a[i]<<" ";}
cout<<"Query succesfully completed "<<i<<" times :)\xA";
return 0;}
care merge OK!. Daca in for-u for (i=0; i<SIZE ; ++i) *(a+i)='a'+i; modific SIZE cu SIZE +1 inca mai ruleaza programul.  La SIZE + 200 inca mai merge. La 2 * SIZE da Segmentation fault (core dumped).

Nu trebuia sa primesc Segmentation fault (core dumped) de la SIZE+1 ?

Mersi inca o data.
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #1 : Octombrie 05, 2008, 17:22:52 »

Nu neaparat, avand in vedere ca pointerul a+i inca face parte din zona alocata pentru programul respectiv (sau oricum, o zona nefolosita de altceva). Cred ca depinde de sistemul pe care faci test, in Linux si mie mi se intampla sa pot iesi cu mult din vector fara sa se supere. El acceseaza un pointer, nu isi da seama ca a "iesit din vector", si d-aia nu ţipă. In Windows nu stii la ce sa te astepti...
Memorat
wefgef
Nu mai tace
*****

Karma: 1049
Deconectat Deconectat

Mesaje: 3.008


razboinicu' luminii


Vezi Profilul
« Răspunde #2 : Octombrie 05, 2008, 19:45:16 »

Welcome to C! Wink

C-ul nu are array bound checking, asa ca rezultatul in cazul accesarilor nepermise este imprevizibil.
Memorat

omului i-au fost date instinctele pentru a supravietui, nu pentru a fi sclavul lor.
rEbyTer
Vorbaret
****

Karma: -85
Deconectat Deconectat

Mesaje: 154



Vezi Profilul
« Răspunde #3 : Octombrie 05, 2008, 20:16:16 »

Este ca si cum parcurg 100km de strada(care sigur exista si pot sa merg pe ea) dupa care intru pe un drum de sat care nu stiu cand sau daca se infunda ?

Cum pot sa modific programul de mai sus ca sa faca alocarea memoriei la fiecare bucla din for? Am incercat cu realloc dar nu mi-a iesit.

Super tare scriptul care editeaza mesajele cu AJAX Wink!
Memorat
toni2007
Nu mai tace
*****

Karma: 160
Deconectat Deconectat

Mesaje: 663



Vezi Profilul
« Răspunde #4 : Octombrie 06, 2008, 08:22:55 »

Cod:
#include <iostream>
#include <malloc.h>
#define SIZE 1000000000
using namespace std;

int main() {
char *a;int i;
//a = (char *) malloc (SIZE * sizeof(char));
for (i=0; i<SIZE ; ++i) {
  a=(char*)realloc(a,(i+1)*sizeof(char));
  *(a+i)='a'+i;
}
//for (int i=0; i<100000 ; ++i) {cout<<a[i]<<" ";}
cout<<"Query succesfully completed "<<i<<" times :)\xA";
return 0;}
Memorat
rEbyTer
Vorbaret
****

Karma: -85
Deconectat Deconectat

Mesaje: 154



Vezi Profilul
« Răspunde #5 : Octombrie 06, 2008, 14:42:12 »

That did the trick, ms.
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines