Dizi uzunluğu belirtilmeyen bir string nasıl tanımlanabilir?

prompt parametre oldugu icin butun parametreler gibi cagiran fonksiyon tarafindan deger ataniyor.

Olay degerin ne zaman atandigi degil, atanan degerin ne oldugu.

char *foo; dersen deger atanmamis oluyor, rastgele bir deger atanmis olarak da dusunebilirsin.
char *bar = "hmm"; dersen 4’luk bir char array’i olusturuluyor ve bar onu gosteriyor.
char baz[4] = "hmm\0"; dersen 4’luk bir char array’i olusturuluyor ve baz onu gosteriyor.

Fonksiyon cagirirken de hangi degeri paslarsan o gidiyor.

void hede(int foo) { ... }; hede(42)
ile
void hede(void) { int foo = 42; ... } ayni sey.

Yani data'yı pointer olarak kullandığım örnekte, hiçbir değer atanmadığı için bir hata oluşuyor. Oysa prompt pointer’ına main fonksiyonunda değer atanıyor.

O zaman değer atama şöyle olmalı değil mi?

int input(char *prompt){
	char x[10];
	char *data = x;	
	printf("%s", prompt);
	scanf("%s", data);
	return atoi(data);
}

Yukarıda char *data pointer’ına gerek yok herhalde, doğrudan bir array kullanılabilir değil mi?

Aynen oyle. Ama (her fonksiyon gibi, her parametre gibi) fonksiyon cagrilmak uzereyken, fonksiyonun o kopyasina ozel bir deger olarak dusunmek daha mantikli olabilir:

void hede(int foo) { ... }
int main(void) {
    hede(3);
    hede(4);
    int x = 5;
    hede(x);
}

Birinin basinda foo = 3;, digerinin basinda foo = 4;, digerinin basinda foo = 5; denmiscesine uc tane deger ataniyor.

Dedigim gibi, dilden de bagimsiz bir sey bu. Programlama dillerinin tamamina yakininda bu semantik var.

char x[10];
char y[10] = "hede";
char z[10]; z[0] = 'h'; z[1] = 'e'; z[2] = 'd'; z[3] = 'e';

Bunlardan herhangi biri kullanilabilir; hepsi 10’luk birer karakter array’ine isaret ediyor. Ikincisinin ilk 5, ucuncusunun ilk 4 elemani tanimli, gerisi tanimsiz.

char *foo = x;
char *bar = "hede";
char *baz = "hede";

Bunlar da kullanilabilir. Ilki yukaridaki 10’luk array’lerden ilkine isaret ediyor; x ile ayni. Ikincisi hic bir yerde karakter array’i olarak tanimlanmamis, fakat yine de 5’lik bir karakter array’i olan seye isaret ediyor.

Bu array’e yazmak undefined behavior (Turkcesi: yanlis); const char* turunde olmasi lazim ama bir takim tarihsel sebeplerden oturu char* turunde. (const char* olsaydi elemanlari const char olurdu. const degiskenlere yazmak compile time’da hata verecegi icin bu yanlisligi onceden yakalardik.)

Ucuncu de ikincisiyle ayni yere isaret ediyor da olabilir, ayni tanimin gecerli oldugu baska bir 4’lik karakter array’ine isaret ediyor da olabilir.

char *nono;

Bu kullanilamaz, cunku kendisine bir deger atanmamis. Okumak veya yazmak dogrudan undefined behavior. Pratikte, rastgele bir hafiza alanina isaret eder ve okumak/yazmak rastgele bir hafiza alaninda okuma/yazma yapilmasini saglar. En iyi ihtimalle isletim sisteminin korudugu bir yere denk gelir ve segfault aliriz.

2 Beğeni

Hmm, şimdi daha iyi anladığımı düşünüyorum. const char, static const char, undefined char vb. gibi kavramlara ve bunların farklarına pek aşina değilim. Yeni yeni C öğrenmeye başlıyorum diyebilirim. :slight_smile: Yardımlarınız için teşekkür ederim.