Arama butonu
Bu konudaki kullanıcılar: 1 misafir
8
Cevap
1262
Tıklama
0
Öne Çıkarma
C pointer sorunu
S
12 yıl (2043 mesaj)
Binbaşı
Konu Sahibi

arkadaşlar kod aşağıdaki şekildedir. şu hatayı alıyorum

'p' may be used uninitialized in this function -wmaybe-uninitialized. var mıdır çözümünü bilen. Yada kodda bir sıkıntı mı var bilemedim ki.

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main()
{
int *p;
for(int i=0; i<10; ++i) {
*(p+i)=rand();
printf("%d\n", *(p+i));
}
return 0;
}



K
12 yıl (52 mesaj)
Çavuş

neden *(p+i) kullandın ki ?


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Sofiman
S
12 yıl (2043 mesaj)
Binbaşı
Konu Sahibi

özel bir sebebi yok. sadece pointer mantığını anlamak için yazmıştım. Aynısını diziylede yapabilirim biliyorum evet ama pointerla yapmak istemiştim.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @kayakoku
K
12 yıl (52 mesaj)
Çavuş

quote:

Orijinalden alıntı: Sofiman

özel bir sebebi yok. sadece pointer mantığını anlamak için yazmıştım. Aynısını diziylede yapabilirim biliyorum evet ama pointerla yapmak istemiştim.

pointer aritmetiğinde örneğin p+1 denildiği zaman compiler memoride bir interger boyutu kadar ilerideki ardesi göstermeye başlar. sıkıntı burada oluşuyor. pointer
için ( ilk satırda yazdığın kod sebebiyle ) sadece bir integerlık yer almasına rağmen p+1 ile sahip olmağın yere değer atamaya çalışıyor.



M
12 yıl (315 mesaj)
Çavuş

Pointer kullanmışsın, ama bellekte yer tahsisi yapmamışsın. :)

malloc() fonksiyonu kullanılmalı.

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>


int main()
{
int *p;
p = (int*)malloc(sizeof(int));

for(int i=0; i<10; ++i) {
*(p+i)=rand();
printf("%d\n", *(p+i));
}
return 0;
}



Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Sofiman
S
12 yıl (2043 mesaj)
Binbaşı
Konu Sahibi

koda eklediğiniz satırda bellekten ne kadar yer tahsis ediyorsunuz? ben malloc() fonksiyonunu genelde p=(int *)malloc(.....*sizeof(int)) şeklinde kullanılıyor diye biliyordumda. noktalı kısmada bir sayı geliyordu. Yani bu vakte kadar ben böyle gördüm.

Sizin denediğiniz gibi yaptım ve sorunu çözdüm evet, sağolun ama dediğim gibi, ne kadar yer tahsis ediyoruz öyle yazınca?


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @MLoveR
M
12 yıl (315 mesaj)
Çavuş

Dediğin şekilde de yani o kısma sayı gelecek şekilde de yapılabilir. Bu şekilde yapıldığında yani benim yazdığım gibi yapıldığında memory'den gereksiz yer işgali yapmış olabiliyoruz.

Senin örneğinde 10 adet rakam alındığı için random olarak, malloc kısmında o rakamın gelebileceği yere 10 yazabiliriz. 10 adet sayı için bellek tahsisi yapıyor. int = 4 byte. 10 sayı diye belirttiğimizde 40 byte'lık yer tahsis etmiş oluyoruz bu şekilde. Öbür türlü daha fazla bir işgal söz konusu olabilir. :)

Bir de benden sana ödev olsun. Bu kodda kullanmamışız gerçi.

free(); fonksiyonunun kullanımına bak. Nerelerde neden kullanırız diye.

Hadi kolay gelsin.


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @Sofiman
S
12 yıl (2043 mesaj)
Binbaşı
Konu Sahibi

return 0; dan önce free(p) yapıp kullanılan alanı geri iade ediyoruz sanırım ?


Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @MLoveR
M
12 yıl (315 mesaj)
Çavuş

Evet.




Bu mesajda bahsedilenler: @Sofiman
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.