Aşağıdaki kodu yazdım (Sadece anlama amacına yöneliktir). Ana dışında, int b; geçici tanım anlamına gelir. İç ana int b = 16 yerel bir değişkendir. Fonksiyon değişkeninin içinde b dahili bağlantıya sahiptir (dosya kapsamı). Çıktı 16 ve 0'dır. Hafızanın, yalnızca başlatıldıklarında geçici olarak tanımlanmış değişkenler için tahsis edildiğini okudum. İşte buradaki sorum, fonksiyonun içinde, printf b'nin değerini basar ve printf çağrıldığında bellek ayrılır mı? Öyleyse, belleğe, ilk erişildiklerinde (başlatılmış veya erişilmiş olsun) geçici olarak tanımlanmış değişkenlere tahsis edildiğini söyleyebilir miyim? Yoksa yanılıyor muyum? daha netlik ekleme: DüzenlendiGeçici Tanım ve bellek ayırma
int b;
int b;
void f1(int a1);
int main()
{
int b=16;
printf("b=%d\n",b);
f1(5);
return 0;
}
void f1(int a1)
{
printf("b = %d\n",b);
}
ben işlevi içinde değişken ana o farklı olduğunu farkındayım. Ayrıca yerel değişkenin yığın halinde olduğunun farkında olun. Benim sorumum, geçici tanım ile ilgilidir. int b iki kere deklare edildi ve C cinsinden kabul edildi çünkü kesin bir tanımdır. Gerçek tanımı olması durumunda, birden fazla tanımlamaya izin verilmez ve dolayısıyla bu kabul edilmez. Geçici tanım hakkında birkaç soru vardır (About Tentative definition). Bunlardan birine göre, "C, hepsi aynı ve eşleştiği sürece aynı değişken için birden fazla tanımlamaya izin veren özel" geçici bir tanım "kuralıdır. C derleyicisi, sahnelerin ardında tüm geçici ifadeleri birleştirir. tek bir tanım olarak tanımlar. " Sorularımı yeniden ifade etmek için:
Değişken sadece geçici olarak tanımlanmış, ancak kullanılmıyorsa bellek ayrılıyor mu? (derleyicinin kodu optimize etmediği varsayılarak). Çeviri biriminin sonunda göründüğü gibi, bellek yukarıda belirtilen soruya göre tahsis edilir. Ya da bellek sadece yumruk zamanı için kullanıldığında (bu durumda printf deyiminde) atanır mı?
'int b; int b; 'izinli? : O – Downvoter
* "Çevirme biriminin sonuna ulaşılmışsa ve tanımlayıcı için bir başlatıcıda hiçbir tanım görünmediyse, geçici bir tanım tam tanım haline gelir" *.Bu yüzden son geçici tanım, global kapsam ve sıfır olarak başlatılmış bir gerçek haline geliyor. –
@cad: Aynı oldukları için: evet. Örneğin; 'typedef int; Bu b; ', standarda bakmak zorunda kaldı, ama yine de cehennem gibi bunu önlemek istiyorum. – Olaf