Lütfen link vermeyin googledan bi sürü kaynak bende buldum ama anlamadım şimdi bellekden yer alıyoruz peki int D[30] şeklinde yaptığımızda da 30 eleman için yer almıyor muyuz dizi içeren bir soruda malloc kullansak ne değişir?




 

dizi yerine malloc kullanılabilir. Hata yapma riskiniz artar, mallocta pointerınız'ın null döndürme riski olur.

Malloc kullanımı şu işe yarar, kullanacağınız değerleri bilirsiniz, o değerlerin kaplayacağı alandan daha fazlasını bilgisayara yüklemezsiniz, mesela uzun bir işlem yapacaksınız ancak, en fazla iki haneli integerlar kullanılacak. mesela 10 tane 2 basamaklı integerla işlem yapacaksanız, malloc kullanarak hafızadan sadece 40 bit ayırarak bu işi yapabilirsiniz, ancak dizi kullanırsanız otomatik olarak 8*10=80 bitlik yer ayrılır ve 40 bit boşu boşuna işlenir. Malloc kodunuza kullanılmayacak fazla bitlerin gereksiz yere beyinde açılmamasını sağlar.

Edit: mini bir somutlama yaparsan,
Sallıyorum malloc ile 1 den 8'e kadar olan sayıları şöyle tutabilirsiniz
001
010
011
100
101
110
111 total 24 bit
Ama bu sayıları dizide tutarsanız
00000001
00000010
00000011
00000100
00000101
00000110
00000111 total 64 bit
şeklinde olur.

edit2: lightblue'ya bir ek, mallocta da sınırı önceden vermek zorundasınız ne yazıkki, sınırı pointer ile aşarsınız sıkıntı olmaz(null dönmesi, ya da bi sonraki kısmın işletim sistemi tarafından zaten kullanılıyor olması elbetteki çok büyük sıkıntı), ama bunu pointerlarla dizilerde de yapabilirsiniz.

diyanet takvimi

int D[30]; dediğinizde kodun içine bir data satırı eklenmiş olur. kod yürütülürken stackte 30 intlik yer ayrılır. mallocta ise koda bir işletim sistemi çağrısı eklenir. bu çağrı heap ten istediğiniz miktarda yer alır sizin programın address space'ine ekler. aradaki fark büyüktür.

talemon

bir de c'de(gerci yeni compilerlar yeni versiyonlar varsa bilemem) fonksiyonun basinda butun degiskenleri initialize etmek lazimdi, sonrasinda fonksyonun mantigi baslardi. daha en bastan bilmiyorsak kaclik array lazim bize - örnegin kullanicidan alinacak ileride - fonksiyon basinda pointer yaratip, gerektigi yerde malloc ile gerekli alani reserve edebilirdik.

c++da sonradan new int[30] diyebiliyorsun tabi..

natnan

Sanal belleğin programcıyla alakalı iki kısmı var: stack ve heap. Stack'in genelde küçük bir sınırı vardır, 8 MB gibi (değiştirilebilir, ama genelde gerek olmaz). Heap ise bilgisayarınızdaki bellek miktarıyla sınırlı, günümüzde yüzlerce MB.

Bir function içinde array yarattığınızda stack'ten belirli bir miktar ayırılır. Eski C standartlarında bu miktarın daha programı yazarken belli olması gerekiyordu, yani

int n = 30;
int arr[n];

gibi bir kodu derleyemiyordunuz. Sanırım yeni standartta mümkün bu. Bunu sıkıntıyı aşmak için malloc kullanılır. Malloc, istediğiniz hafızayı heap'ten alır, ve size pointer verir, "al abi, sana istediğin kadar byte verdim, tepe tepe kullan" der.

Bir kaç önemli nokta:
- Array'lere pointer gibi davranabilirsiniz. Ama bir array olarak yaratılmış bir pointer'ın değerini değiştiremezsiniz, yoksa segfault yersiniz. Yani şu yasak:

void func(int* ptr)
{
int d[30];
...
d = ptr; //olmaz
}

Bunun bir sınırı: bir kez bir array yarattığınızda boyutunu değiştiremezsiniz. Ama malloc'la aldığınız bir pointer'daki alanı realloc ile değiştirebilirsiniz. Boyutu değişecek bir veri yapısı için bu çok faydalı ve gerekli.

- Malloc null döndürebilir. Kontrol edin.
- Malloc'la aldığınız bir bloğu, daha sonra free fonksiyonu ile "işim bitti bunla" diyip serbest bırakın. (bkz: memory leak) Daha sonra o pointer'ı sakın kullanmayın.

Kısacası, arrayler daha basit ve ufak diziler için rahat. Basit ve temiz oluyorlar. Ancak daha büyük hafıza blokları, ya da değişebilir boyutlar için malloc daha rahat olacaktır.

Unutmuşum: Ayrıca arrayin içindeki sayı, kaç eleman alacağını gösterir. Yani int d[20] derseniz, 20 int'lik blok ayrılır. Malloc'ta ise kaç byte istediğizi verirsiniz. Yani ptr = malloc(20) diyip oraya 20 tane int koymaya çalışırsanız, geçmiş olsun. Doğrusu malloc(20 * sizeof(int)) olacak.

metalik
1

mobil görünümden çık