Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

2 adet C sorusu


Penthesilea

Öne çıkan mesajlar

char* a[] ile char** a arasinda ne fark vardir?


Simdi 1 icin sunu biliyorum ki char *a = "abikgubik" dedigin zaman, global ve static bi data yaratiyosun ready only memory'de, bu yuzden bunu modify etmeye calistigin zaman seg fault yiyosun. char a[] yaparsan lakin, local datada bi array initialize etmis oluyosun.

fakat burada ikisi de pointer. neler yasariz? Dusuncem sudur ki, birincisinde local datadaki arraylere pointer yaratiyosun kisaca. yani arrayleri komple degistiremiyorsun, ama arrayler local datada oldugu icin icerigini modifiye edebiliyorsun. ikincisindeyse hicbise yapamiyorsun.

edit: 2. bi soru vardi halletim onu
Link to comment
Sosyal ağlarda paylaş

char * a ve char a[] için söylediğin doğru. Arada iki önemli fark var:




1) Array'deki pointer const pointer, haliyle değiştirilemiyor.
2) Array yaratırken belirli sayıda yer ayırtıyorsun. char a[3] dersen üç tane char yeri ayırtılıyor. char a[] = "ab" dersen üç tane yer ayırtılıp içine 'a', 'b' ve '' char'ları ile dolduruluyor. Pointer'da ise ifadenin sağ tarafı boşsa yer ayırtılmıyor. Pointer içindeki adres rastgele bir yeri gösteriyor.

Spoiler içi yazdıklarım yanlışmış. Kafanız karışmasın diye saklıyorum.

Çift katlı pointer'lar işin işine girince iş biraz değişiyor. Demin MinGW indirip bir iki şey denedim.

char * b[3];
(*b)[0] = 'A';

-> crash

Ayrıca *b ile ulaştığın array olsaydı adresini değiştiremiyor olman gerekirdi. Ama şu şekilde bir atama yapabiliyorsun:


char * b[3];
char a[5];
*b = a;


MinGW mesajlarına göre a 'nın tipi char[5]. *b 'nin tipi ise char* . Anladığım kadarıyla char * b[3] dediğin zaman array elemanları için yer ayırtılmıyor. Yani 3 rakamının bir rolü yok gibi.

Bu durumda char * b[3] ile char ** b ile arasında bir fark yok muhtemelen. Ama daha iyi bilen birinden onay alana kadar fazla güvenme derim. C tecrübem yok çünkü.

Link to comment
Sosyal ağlarda paylaş

Mirage said:
Çift katlı pointer'lar işin işine girince iş biraz değişiyor. Demin MinGW indirip bir iki şey denedim.



char * b[3];
(*b)[0] = 'A';

-> crash

Ayrıca *b ile ulaştığın array olsaydı adresini değiştiremiyor olman gerekirdi.



char* b[3]; 
//stack de 3 tane "char*" için yer ayırdırn
//3 tane DWORD aslında.32 bit makinada DWORD b[3]; ile
//aynı makine kodunu üretir

(*b)[0] = 'A';
// (*b)[0] dediğin aslında *((*b)+0) yani -> **b ='A'
//*b uninitialized diznin ilk elemanındaki garbage data
//**b garbage data nın gösterdiği gudik bellek bölgesi
//**b='A' seg fault, access violation..-
Link to comment
Sosyal ağlarda paylaş

Penthesilea said:
char* a[] ile char** a arasinda ne fark vardir?


char* a[];

diye olmaz da misal o

char* a[]={"asda","qwe","zxc"};

şeklinde durur. veya fonksiyon argümanı şeklindedir.

void func(char* a[]);

gibin.

fonksiyon argümanı olarak kullandıysan bir farkının olmaması gerekli. en azından üretilen kod olarak.

ilki gibi stack de initialization yaptıysan, seninçün stackte 3 tane "char*" elemanı olan bir dizi yaratır. (char* da en az int kadar bi veri tipidir zira)

burdaki karmaşa şeyden çıkıyor C de stack de array initialize ederkene,

int myarray[]={1,2,3,4,5,6};

derseniz compiler,compile time da sizin parantez içindeki elemanlarınızı sayar, kalkar şuna denk bir kod üretir;

int myarray[6]={1,2,3,4,5,6};
Link to comment
Sosyal ağlarda paylaş

Rahan said:

[code]char* b[3];
//stack de 3 tane "char*" için yer ayırdırn


Ben pointer'ların sırasını yanlış düşünmüşüm. Stack'te 3 tane "char*" için yer ayırdığında ilk dimension array, diğeri pointer oluyor yani. Ben ilk dimension pointer, ikinci array olcak gibi düşünüyordum.

Yani burda b değişkeni char*[3] tipinde, b[n] ise char* tipinde.

Saol Rahan rahatladım biraz. :)
Link to comment
Sosyal ağlarda paylaş

Ya bu ne salak bi dil of.
Yarin Microsoft son tur icin Seattle'a gidiyorum, boyle sorular da gelicek haliyle. Ben de 1.5 senedir falan C++'a dokunmadim, nasil eziyet cektigimi anlatamam su an.

Cok tesekkurler ikinize de.

Yani kisaca, fonksiyon argumaniysa bi farki yok, initialization icin kullandiysam bitanesi ilk mesajda dedigim gibi char* arrayi yaratiyor, digeri pointera pointer yaratiyor?
Link to comment
Sosyal ağlarda paylaş

Aynen öyle.

Demin MinGW ile denedim. Fonksiyon argümanıysa normal pointer olarak algılanıyor. Şöyle bir atama yapabiliyorsun mesela sorun çıkmadan:

void ptrTest(char a[]) {
char b[] = "lol";
a = b;
}

Bunu main içinde yapmaya kalksan "array'e array atayamazsın" gibi bir mesajla compile edemezsin.
Link to comment
Sosyal ağlarda paylaş

microsoft interviewlarında daha çok algoritma bilgisi sorarlar. interview questionaire leri dolaşıyor etrafta.

mutlaka bir aran. zira algoritmayı bilmediğinde kalkaldığın sorular var. (:P)

C/C++ detaylarına kasmak ne kadar mantıklı bilmiyorum. şöyle bir 4-5 yıldır sürekli kullanıyor değilseniz zaten bir yerden batırır.

bir de illa ki C kodu yazman gerekirse kendine güvenemezsen array yerine vector kullan, ya da zorlanırsan char* yerine std::string kullan, bilmen gereken şeyler çok daha az bunlarda. java daki collectionlar gibi. (java çok ilkel kalıyor tabi.)
Link to comment
Sosyal ağlarda paylaş

Mirage said:
Aynen öyle.

void ptrTest(char a[]) {
char b[] = "lol";
a = b;
}


Bunu main içinde yapmaya kalksan "array'e array atayamazsın" gibi bir mesajla compile edemezsin.


fonksiyona parametre tipi olarak char a[] gibi bişi kullandığında char arrayinin char* dan bir farkı yok.


int main()
{
char stackArray[]="my string";
ptrTest(stackArray);
cout << stackArray;
}

void ptrTest(char a[]) {
char b[] = "lol";
a = b;
}


dersen "lol" yerine "my string" yazdırır.

C de function çağırmadan (memcpy,strcpy vs.) veya birebir kendin kopyalamadan(for ile içini dönerek) arrayi arraye eşitleme gibi bişi yok.
Link to comment
Sosyal ağlarda paylaş

Rahan said:

fonksiyona parametre tipi olarak char a[] gibi bişi kullandığında char arrayinin char* dan bir farkı yok.


Onu diyorum işte. Örnekle anlatmaya çalıştım sadece.

char *stackArray = "my string";
char *secondArray = "another";
stackArray = secondArray;
cout << stackArray;

bu yukardaki gayet düzgün çalışırken aynı atamayı aşağıdaki gibi array'e yapmaya kalkınca compile edemiyorsun.

char stackArray[] = "my string";
char *secondArray = "another";
stackArray = secondArray;
cout << stackArray;


Ama kalkıp aşağıdaki gibi stackArray'i fonksiyon argümanı olarak tanımlarsan compile edilebiliyor, çünkü array olarak değil char* olarak algılanıyor. Array kopyalamanması ayrı konu.

void ptrTest(char stackArray[]) {
char *secondArray = "another";
stackArray = secondArray;
cout << stackArray;
}
Link to comment
Sosyal ağlarda paylaş

Tesekkurler arkadaslar.

Rahan onlara baktim zaten bi genel olarak. Benim problem iste Java ve Python'a asiri alismis olmam. Adam bana ilk round interview'unde bi string al, her kelimeyi tersine cevir dedi.

String[] split = str.split(" ");
for(String s: split) {
s.reverse();
}

dedim yarildik biraz, sonra oturdum amele gibi C++'da yazdim :) Algoritma sorduklari surece ve dile karismadiklari surece sorun yasamam diye ummaktayim, kismet. Microsoft Dynamics oldugu icin game-theory falan da gelcek bi de =/
Link to comment
Sosyal ağlarda paylaş

simdi sordugun soru kolay soru degil, muhtemelen python la filan pratigni varsa ve adamlar o sorulari soruyorlarsa gecemegebilirsin ve aradiklari profil farkli demektir. bilmiyorum mevcut durumunu fakat sorudugn sorular icin, kisisel olarak oncelikle 'binary sections' konusuna daha sonrada C promotion konusuna bakmani tavsiye ederim, pythonu yillardir bende kullaniyorum ama python bu sorulari cevaplicak bir dil degil, sadece isvec cakisi.
Link to comment
Sosyal ağlarda paylaş

baktim simdi tekrar soruyada, o kafayla o saatte mesaj atmamaliymisim onu anladim :)
ben kisisel olarak program yazarken bazen neyi degistirip neyi degistiremeyecegimi unutuyorum, cok kural var cunku. onun yerine binary tool lari kullaniyorum bayagi fayda sagliyor, mesela ornek bir kod;

#include
char *glbptr = "global_ptr";
char *glbptr2;
char glbarr[] = "global_array";
int main(void) {
printf("armut is %s, elma is %sn",glbptr,glbarr);
glbarr[6] = '?';
printf("armut is %s, elma is %sn",glbptr,glbarr);
return 0;
}

simdi mesela derlenme sirasinda ne nereye atiliyor falan filan unuttun diyelim, yada uninitialized data (glbptr2) nereye atilir gormek istiyorsun (malum compiler a gore degisebilicek bisey) soyle yapabiliriz;

sinan@etch-ev:~/tmp$ objdump -x a.out | grep glb
080495f8 g O .data 0000000d glbarr
0804960c g O .bss 00000004 glbptr2
080495f4 g O .data 00000004 glbptr

hmm evet demekki glbptr2 miz .bss de imis, peki bunlarin icerikleri yada gosterdigi yerleri merak ettik;

(gereksiz yerleri kestim)
sinan@etch-ev:~/tmp$ objdump -s a.out

Contents of section .rodata:
80484c0 03000000 01000200 676c6f62 616c5f70 ........global_p
80484d0 74720061 726d7574 20697320 25732c20 tr.armut is %s,
80484e0 656c6d61 20697320 25730a00 elma is %s..

Contents of section .data:
80495e8 00000000 00000000 fc940408 c8840408 ................
80495f8 676c6f62 616c5f61 72726179 00000000 global_array....

evet glbarr'un icerigi .data sectionda boylelikle degistirebilcegimiz anlamina geliyor, zaten ornek kodun output'uda
armut is global_ptr, elma is global_array
armut is global_ptr, elma is global?array
tabi bu kucuk bir kod, buyuk kodlarda boyle inceleme cok zorlasiyor.

onun disinda array ile pointer kullanimi aslinda ayni olsada, islenis olarak ayni olmadigi gibi onlarin fonksiyona verilis tarzlarida gercekten bence onem yaratiyor. aslinda hep hocalarimizin soyledigi ama neden oldugunu bilmedigimiz konular daha sonra meydana cikiyor, mesela deklare ederken ki sikilik, define ettiginle uyusmasi gibi, argumanin char **p mi yoksa char *p[] olarak mu yorumlanicagi ve nasil davranicagi burada devreye giriyor, promotion konusunda (bununla ilgili link bulursam paste licam).
mesela ornek kod,
#include
char a[] = "01234";
int main(void) {
printf("1. eleman %cn", a[1]);
printf("1. eleman %cn", 1[a]);
return 0;
}
cikti ise ;
1. eleman 1
1. eleman 1

komik dimi :) bence bu tur konularda en guzel kaynak,
http://c-faq.com/aryptr/index.html
Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...