Basit!! bir C Sorusu (Cevapları Bekliyorum)

Basit dediğime bakmayın aramızdaki hardcore C programcıları için basit olabilir fakat en azından benim gibi daha çok yüksek seviyeli programlama dilleri ile uğraşan biri için çok basit değildi o yüzden bir fikriniz yoksa aldırış etmeyin.

Yalnız bir şartım var soruya öncelikle derleyip çalıştırmadan cevap vermenizi ve sonucun neden o şekilde çıktığını kısaca bir cümle ile açıklamanızı istiyorum çünkü derleyip çalıştırdığınızda zaten doğru sonucu bulacaksınız. Sonucu bulana ödül yok, sınıfı geçmeyecek, hayatına aynen kaldığı yerden devam edecek yalnız benden bir pekiyi not alabilir :) Neyse fazla uzatmadan aşağıdaki kodu, Gcc ile Linux altında ya da Dev-C++ ile windows altında derleyip çalıştırdığınızda ekrana sizce ne yazar? Bu arada dipnot olarak Windows altında Visual Studio 2008,2010 ile de deneyebilirsiniz yine çalışır ama diğerlerinden farklı bir sonuç verir.(neden ?)
college essay writer

#include <stdio.h>

void function(int a, int b) {
     int c=0;
     int* pointer;
     
     pointer =&c+2;
     (*pointer)+=8;
}

void main() {  
  int x =0;
  int y=0;
  function(1,2);
  x = 3;
  y =5;
  printf("x=%d\n, b=%d\n",x,y);
}

Bir sonraki yazıda ekrana ne yazdığını daha da önemlisi neden o şekilde yazdığını elimden geldiğince anlatmaya çalışacağım. Ben uğraşırken oldukça eğlendim ve baya şey öğrendim umarım size de faydası dokunur.Hadi bakalım cevapları bekliyorum :)

765qwerty765

18 thoughts on “Basit!! bir C Sorusu (Cevapları Bekliyorum)

  1. Volkan SLAMA

    şimdi function çağrıldıktan sonra b nin tanımlaması yapılmış. Bunun standart c ye uygun olmaması lazım. Onun için derleyiciden derleyiciye farklı sonuç çıkabilir. c++ derleyicide mi derliyorsunuz? Onun haricinde bir tahmin yürüttüm ama şarjım bitiyor şimdi :) Yazacağım daha sonra

  2. M. Cihat Altuntaş Post author

    @Volkan
    Evet haklısın C++ olarak derlenmişim o yüzden C uyumlu olsun diye değişkeni y olarak değiştirip yukarı taşıdım derlenebilir hale getirdim. Ama sorum hala devam ediyor :)

  3. Hasan

    Integer degerleri hafizada 2 byte ve 4 byte olarak tutulabiliyor.Buna göre farkli sonuclar olabilir.Yani c=0 degiskeninin 1000 nolu adreste oldugunu varsayarsak pointer aritmetigine göre pointer degiskeninin adresi pointer = &c + 2 islemlerine göre 1000 + 2 * 2Byte = 1004 veya 1000 + 2* 4Byte = 1008 olabilir. Herhalde buradan yola cikilabilir.

  4. ozgur

    C’de fonksiyon çağrısında geridönüş adresi stack’te saklanıyor. Fonksiyon içinde sanırım bu adres üzerinde 8 bayt gibi bir öteleme yapılıyor. Bundan dolayı da fonksiyon geri dönerken kaldığı yerden devam etmeyip, x=3 y=5 satırları işletilmeden printf fonksiyonu çağrılıyor. Çıkış galiba 0 olur.

  5. berk

    Merhaba ben progamınızı derlemeden dediğiniz gibi okuyup çalıştırdım
    ve bana göre rasgele tanımlanmış bir pointerin gösterdiği bellek adresi nekadar değiştirilirse değiştirilsin programın main kısmında kullanılan değişkenlerin bellek adreslerini gösterip herhangi bir değer değişimine neden olmadığı sürece programın çalışmasında ve kullanılan değişkenlerin içeriğinin değişmemesi gerekir ,fakat derleyip çalıştırdım ( dev-c++ ile) fakat gördüğüm kadarıyla x ve y değişkenleri herhangi bir parametre olarak aktarılmamasına karşın hatta ve hatta aktarılsa bile metod içinde pointerin gelen parametreler üzerinde bir etkisi olmamasına rağmen hala neden program böyle saçma bi cevap veriyor hala anlamış değilim gerçekten bende çok merak ettim kısa bi açıklama yazabilirseniz çok sevinirim .
    şimdiden teşekkürler

  6. Asım Doğan Namlı

    şimdi bu profesyonellerin oturup tartıştığı ortama biraz su katıcam ama functiona a ile b yollanıyo da nasıl oluyoda function ‘da a ile b hiç geçmesede a ile b işleniyo bunu bitürlü anlayamadım ??? :S

    -bu arada hiç C veya C++ kullanmadım Daha çok .NET le ilgilendim (C#,VB,vs,,,) :D -

  7. agn

    Öteleme gecici bir bölgede yapılıyor ve geri dönüş değeri yok. Kod, fonksiyonun adresine erişim yapmıyor. Uygulama bellek üzerinde erişim ihlali yapıyor ve bölge tahsis edilmemiş bir alan (tüm diğer uygulamalar da dahil) ve fonksiyon o alanda atama yapıyor. İşletim sisteminin denetimine göre eğer tahisis edilmemiş alanda atama serbest değilse(olmamalı) işletim sistemi uygulamayı durdurur. Eğer atama yaplan yer başka bir uygulamaya aitse yüksek olasılıkla o uygulama da kitlenir ya da o da çöker. Print edilen değerler (rastgele) bellekte duran değerlerdir.

  8. Hasna Hüseyin ÇAKIR

    VS 2010’da derledikten sonra dediğim gibi çıktı verdi, ancak stack hatası verdi şöyle ki:
    Run-Time Check Failure #0 – The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

    Yani fonksiyon main’de çağrıldıktan sonra stack pointer’ın (ESP’nin) kaydedilmediğinden bahsediyor.

  9. süleyman

    gcc(winNT) de derledim x = 3, b=5 yazdı üstüne birde yürütme anı hatası verdi (: , anlatılmak isteneni anlamadım açıklayabilirseniz çok sevinirim :)

  10. Hasan MANZAK

    C den ziyade Assembly bilgisi gerektiren bir konu bence :) Windows altındaki çalışma hatalarını anlayabilmek için Stack Pointer, Base Pointer ve Instruction Pointer konusunda, aralarında yapılan paslaşmalar konusunda da bir şeyler bilmek lazım sanırım.

  11. aş,fdsr

    #include
    #include

    void function(int a, int b) {
    int c=0;

    int* pointer;
    pointer =&c+2;

    (*pointer)+=8;

    }

    int main() {

    int x =0;

    int y=0;

    function(1,2);

    x = 3;

    y =5;

    printf(“x=%d\n, b=%d\n”,x,y);
    getch ();
    return 0;

    }

Comments are closed.