March 19, 2009

Bir is mulaktinda basiniza gelebilecekler…

Filed under: General — Tags: , , , , , , — admin @ 11:46 am

Merhaba,
Bu makalede size unlu bir gomulu yazilim firmasinda maruz kaldigim birkac garip soruyu ve bunlarin yorumunu paylasmak istiyorum.

Maruz kaldigim mulakatta:

1
2
3
4
5
6
7
8
9
10
11
12
/*module ise_almiyacagiz.c begin*/
#include <stdio.h>
 
int
main(){
   char array[] = {'s', 'e', 'n', 'i', ' ', 'i', 's', 'e', '  ', 'a', 'l', 'm', 'i', 'y', 'a', 'c', 'a', 'g', 'i', 'z', '!'};
   char *p;
   p = &array+1; /*Trap*/
   printf("character = %c\n", *(p-1));
   return 0;
}
/*module ise_almiyacagiz.c end*/

seklinde bir soru vardi.

Bu soruda istenen ekrana neden ‘!’ isaretinin basildigi idi.
Evet sasirmayin, bu kodu gcc,

p = &array+1;

satirinda bir yamukluk var uyarisi ile derleyip elf dosyasini olusturabiliyor.
Ve ekran ciktisida (derleme islemi ile birlikte):

hede@hodo ~$gcc -o ise_almiyacagiz ise_almiyacagiz.c
hede@hodo ~$./ise_almiyacagiz
!
hede@hodo ~$

seklinde.

Sanirim size de garip geldi

p = &array+1;

burada bir pointerin adresini neden bir sayi ile toplaniyor; aritmetik islem desem degil, pointer aritmetigi desem pointerin basinda & isaretinin ne isi var diye.

Burada puf nokta soyleymis:

p = &array+1;

yapildiginda array olarak gosterilen pointerinin gosterdigi bellek alaninin uzunlugu kadar bir oteleme saglaniyormus. Boyle oluncada *(p-1) dizinin son elemanini gosteriyor tabiki.

Simdi de uygulamayi ddd uzerinden debug edelim.

DDD debug

DDD debug

Debug islemindende anlasilacagi uzere ‘&array’ in degeri (char (*)[21]) seklinde.
Simdi bu satiri,

8
p = &array+1;

su sekilde yazabiliriz

8
p = array+sizeof(char(*)[21])*1;

programlamada cok sik karsilasmayabileceginiz problemler icin basarilar dilerim.

Yazilim firmalarinda mulakata gireceklere basarilar….

Powered by WordPress