Kezdőoldal » Számítástechnika » Programozás » Mit jelent ez a warning C-ben?

Mit jelent ez a warning C-ben?

Figyelt kérdés

More than 65535 bytes in 'double [100000]'.


Ez azt jelentené, hogy túlcsordul a tömb?


2017. nov. 30. 21:08
 1/6 anonim ***** válasza:

Nem, ez azt jelenti, hogy a verem csordul túl.

Mivel ez nem dinamikusan foglalt memória, így eléggé limitált méretű, úgy látom 65535 bájtban limitálva. Ha ilyen nagy tömb kell neked, foglalj dinamikusan memóriát (malloc függvény), és majd a végén szabadítsd fel.

2017. nov. 30. 21:53
Hasznos számodra ez a válasz?
 2/6 anonim ***** válasza:

Dinamikus helyfoglalás:


double* arrdbl;

if ( (arrdbl = (double*)malloc(sizeof(double)*100000))==null ) {/*hibakezelés*/ return;}

..

free(arrdbl);

2017. dec. 1. 03:32
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:

Amúgy nem biztos, hogy túlcsordul, mert ez egy fordítási warning lehet. És nem "C-ben", hanem egy konkrét C fordító figyelmeztetése, szóval hogy mit jelent, az fordítótól függ.


Ha verembe akarod létrehozni, akkor inkább ne. Dinamikusan foglald le.

2017. dec. 1. 09:57
Hasznos számodra ez a válasz?
 4/6 A kérdező kommentje:

Köszönöm! Ha megkérlek elmagyaráznád, hogy az alábbi sorban mi mit jelent?

if ( (arrdbl = (double*)malloc(sizeof(double)*100000))==null ) {/*hibakezelés*/ return;}


Az if meg a == oké, a többi viszont ismeretlen számomra.

2017. dec. 1. 16:51
 5/6 anonim ***** válasza:

if ((arrdbl = (double*)malloc(sizeof(double)*100000))==null ) {/*hibakezelés*/ return;}


sizeof( t )

Operátor (nem függvény), ami visszaadja az adott t típus méretét bájtban. (Fordításkor értékelődik ki!)


sizeof(double)

A double típus mérete. Ha minden igaz, 8 bájt.


sizeof(double)*100000

100000 darab double változó össze mérete bájtban. (Merthogy egy változó mérete * 100000)


malloc( x )

x bájt méretű memóriát foglal le, pontosabban az operációs rendszertől kér.

Ez void pointert, típus nélküli mutatót ad vissza, ami a lefoglalt memória elejére mutat, vagy null pointert, ha nem sikerült a foglalás.


malloc(sizeof(double)*100000)

100000 db double típusú változóhoz szükséges memóriát foglal le, cím-folytonosan (tehát egy "darabban").


(double*) valami

A valami nevű pointer típusát kényszeríti, hogy double* típusú legyen, tehát double változóra tudjon mutatni. Ez a változó kiolvasásakor fontos, mert nem mindegy, hogy a progi majd hogyan értelmezi az ott lévő adatokat.


arrdbl = (double*)malloc(sizeof(double)*100000)

Ez így memóriát foglal, és az eredmény void pointert double* pointerré kényszeríti. Ezután ezt letároljuk az arrdbl pointerben.


(változó = érték) == null

A C-ben az értékadás is egy kifejezés, van értéke. Tehát egy változóba értéket teszünk, és ennek az értékadásnak az értéket (ami itt az "érték" lesz) rögtön megvizsgáljuk, hogy egyenlő-e null-lal.

Ez így néz ki szétszedve, ez lesz az if feltétele:

(

__arrdbl = (double*)malloc(sizeof(double)*100000) /* <--értékadás */

) == null


Vagyis:


if (

__( arrdbl = (double*)malloc(sizeof(double)*100000) ) == null

) {...}


Tehát kértünk adott méretű dinamikus memóriát, az oda mutató pointer típusát átalakítottuk, hogy valóban double-ra mutasson, eltároltuk a double* típusú változónkban, ezt rögtön megvizsgáltuk, hogy null-e, és ha igen, akkor nem sikerült a foglalás, tehát lefut a hibakezelés, nem engedi tovább futni a kódot.


Ezután használható az arrdbl[x] kifejezés, mert a lefoglalt terület tuképpen egy tömb.

A munka végén fel kell szabadítani a lefoglalt memóriát:

free(arrdbl)


Ha valamit elnéztem, remélem javítanak. :)

2017. dec. 1. 18:03
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:
Ajjaj, túl nagy a csend. :))
2017. dec. 3. 13:16
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!