infoarena

infoarena - concursuri, probleme, evaluator, articole => Informatica => Subiect creat de: Herpesius din Octombrie 05, 2008, 14:30:12



Titlul: Ce fac cu malloc() si realloc() ?
Scris de: Herpesius din 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.


Titlul: Răspuns: Ce fac cu malloc() si realloc() ?
Scris de: Sima Cotizo din 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...


Titlul: Răspuns: Ce fac cu malloc() si realloc() ?
Scris de: Andrei Grigorean din Octombrie 05, 2008, 19:45:16
Welcome to C! ;)

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


Titlul: Răspuns: Ce fac cu malloc() si realloc() ?
Scris de: Herpesius din 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 ;)!


Titlul: Răspuns: Ce fac cu malloc() si realloc() ?
Scris de: Pripoae Teodor Anton din 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;}


Titlul: Răspuns: Ce fac cu malloc() si realloc() ?
Scris de: Herpesius din Octombrie 06, 2008, 14:42:12
That did the trick, ms.