Forumlar » 2. Programlama » C++ » C de pointer ile alakali sorun.

 

> 1 <
Yazar Mesaj

Çevirmiçi mi? vigoreux

emre gurbuz
3 ileti

Şehir: Türkiye ankara
Meslek: ogrenci
Yaş:
15:00 12-09-2005 GMT+02 saat      
merhaba c de pointer konusu ogrenmekteyim.asagidaki ornek kod ta derleyici hic bir hata vermezken runtime da program hatadan dolayi kapatiliyor.

Kod:
#include <stdio.h>
#include <string.h>

int main() {
char *ad2 = "orjinal2";
char ad[] = "orjinal1";

printf("OP:1\n");
strcpy(ad, "degisti1");

printf("R: %s\n", ad);
strcpy(ad2, "degisti2");

printf("R: !%s\n", ad2);

return (0);
}


Biraz araştirma yaptiktan sonra bunun pointerin gosterdigi yerin guvenli olmamasindan kaynaklandigini az bucuk anladim.Ancak kafamda yerinde oturmasi icin detayli bir anlatima ihtiyacim var. nasil oluyor da ad2 isimli pointeri strcpy() da kullanmassam hic bir hata olmadan bir sonraki printf() de ekrana yazdirabiliyorum, ama hiç bir degisiklik yapamiyorum?.İlgilenen arkadaslara simdiden tesekkurler...
iyi gunler.

Bu mesaj vigoreux tarafından düzenlendi (15:23 12-09-2005 GMT+02 saat, 977 Gün önce)

Çevirmiçi mi? zakkeyboorock

Zeki Burak Ata
480 ileti
http://www.biltec.org
Şehir: /bin/bash
Meslek: THE ONE
Yaş: 23
09:08 13-09-2005 GMT+02 saat      
Kod:
#include <stdio.h>
#include <string.h>

int main()

{
char ad2[] = "orjinal2";
char ad[] = "orjinal1";

printf("OP:1\n");

strcpy(ad, "degisti1");

printf("R: %s\n", ad);

strcpy(ad2, "degisti2");

printf("R: !%s\n", ad2);

return 0;
}


bu şekilde çalıştırınca problemsiz çalıştırıor
In me you trust

Çevirmiçi mi? Bahadır DAVUT

Bahadır Davut
444 ileti

Şehir: Türkiye
Meslek:
Yaş: 24
09:52 13-09-2005 GMT+02 saat      
iyi de amaç pointer kulanmak değil mi? unuttum c yi de o anki memory cell dolu olduğundan bi hata veriyo olabilir mi?

Çevirmiçi mi? zakkeyboorock

Zeki Burak Ata
480 ileti
http://www.biltec.org
Şehir: /bin/bash
Meslek: THE ONE
Yaş: 23
15:13 14-09-2005 GMT+02 saat      
e zaten array de pointer baho. yoksam deil mi??

edit: array ile pointer aynı şey demek istemedim yanlış anlaşılmayı düzelteyim dedim

Bu mesaj zakkeyboorock tarafından düzenlendi (16:10 16-09-2005 GMT+02 saat, 973 Gün önce)
In me you trust

Çevirmiçi mi? Karatekin

Mücahit Karatekin
69 ileti
http://www.karatekin.info
Şehir: Türkiye Nevşehir
Meslek:
Yaş:
20:23 14-09-2005 GMT+02 saat      
Heap alanında temel veri tipleri name-value pairleri olarak tutulur ve değer kısmında aldığı değer tutulur. Pointerlarda ise bu value kısmında adres tutulur ve heap de bu adrese denk gelen bir alan vardır. Array de bu kısımda yerine göre değer yerine göre adres tutulur mesela eğer pointer array se adres tutulur.
Belki bir şeyler ışıldar. ))
Mücahit Karatekin
http://www.biltec.org

Çevirmiçi mi? vigoreux

emre gurbuz
3 ileti

Şehir: Türkiye ankara
Meslek: ogrenci
Yaş:
04:25 15-09-2005 GMT+02 saat      
hocalar eywallah cvplar icin.
Ben arastirdim ogrendim sebebini.Soyle anlatayim.Dizilerle initialize yapildiginda(mesela a[]="deneme") "deneme" sabiti bellegin text segment bolgesinde yaratilir. ve daha sonra data segmentine kopyalanir.text segment sadece okunabilir veya calistirablir alandir uzerine yazilamaz.data segment ise okuanbilir, ve yazilabilir alandir.diziler veriye direct olarak eristiklerinden dizi elemanlarinin degerlerinin degistirilmesi herhangi bir 'segmentation fault' a yol acmamaktadir. Oysa pointerlar indirect erisirler nesnelere.Bununla birlikte char *p="deneme" ile p pointeri initialize edildiginde, p nin tuttugu adres "deneme" sabitinin bulundugu adrestir.Sabitler de text segment te olusturldugundan ve bu segment sadece r-x(read/execute) oldugundan uzerine yazilmaya calisildiginda error firlatmaktadir.Bu yuzden pointerlara bir sabitle ilk deger verilecekse daha onceden malloc,alloc.. fonksiyonlari ile yer tahsis edilmelidir...

char *ad2="orjinal2";
printf("%s",ad2); //burada hic bir prob. yok
*(ad2+1)='c'; //kelimenin 2. harfini c yapmaya calisiyorum, ama burada hata veriyor.

Burada goruldugu gibi ad2 pointeri icin bellekte yer alinmadan deger atanmis ve bu deger degistirilemez alanda oldugundan 2. harfini degistirmeye kalktigimda program runtime hatasi veriyor....

Ve işte dügüm noktasi:POINTER ILE DIZI AYNIDIR DEMEK HATADIR.Aralarinda bir cok fark var.Genelde kitaplarda okuyucunun kafasini karistirmamak icin aynidir denilip kesilip atiliyor.
Bir kere pointerlar bir nesnedir oysa adres tutan dizi isimleri sadece bir adres sabitidir ve lvalue(sol deger) olarak kullanilamaz nesne olmadigindan.Sonra pointer ile dizinin bellege erisim yollari farklidir. Hic bir zaman dizi_ismi++ yada dizi_ismi-- gibi ifadeler de bulunamazssiniz...vs.Bir suru sey.
cvplar icin tesekkurler...
iyi gunler
> 1 <