Sorunun Tarihi
return operatörü, C dilinde fonksiyonun çalışma sürecini açıkça sonlandırmak ve sonucu çağıran koda iletmek için ortaya çıkmıştır. Eski programlama dillerinde her zaman değer döndürme olanağı bulunmamakta, return mekanizması hesaplama sonuçlarını açıkça belirtmeyi mümkün kılmıştır. Bu, programların ifade gücünü ve güvenliğini artırmıştır.
Sorun
Ana görev: fonksiyonu düzgün bir şekilde sonlandırmak ve gerekiyorsa, belirli bir türle ilgili bir değeri döndürmektir. Hatalar genellikle yanlış türde bir değerin döndürülmesi, var olmayan veya yerel değişkenlere işaretçilerden döndürülmesi veya dönen değerin çağıran taraf tarafından göz ardı edilmesi nedeniyle ortaya çıkar.
Çözüm
Kod örneği:
#include <stdio.h> struct Point { int x, y; }; struct Point make_point(int x, int y) { // yapı döndürüyoruz (kopya) struct Point p = {x, y}; return p; } int* dangerous() { int num = 42; return # // tehlikeli: yerel değişkenin adresini döndürme! } void do_nothing() { return; // void türündeki fonksiyonlar için doğrudur } int main() { struct Point p = make_point(3, 4); printf("%d %d\n", p.x, p.y); int* ptr = dangerous(); // UB: ptr yok edilmiş alana işaret ediyor }
Anahtar özellikler:
Değer döndürmeyen (void) fonksiyonlarda return kullanılabilir mi?
Cevap: Evet, void fonksiyonları için "return;" yazılabilir, ancak ifade belirtilmesi (return x;) mümkün değildir.
Bir diziyi fonksiyondan döndürdüğümüzde ne olur?
Cevap: C dilinde bir diziyi doğrudan döndürmek mümkün değildir. Yalnızca bir işaretçi döndürülebilir (örneğin, statik bir dizi için), ancak genellikle işaretçi ve boyutu döndürmek veya dinamik olarak ayrılmış bir dizi kullanmak daha doğru olur.
int* make_arr() { static int arr[5] = {1,2,3,4,5}; return arr; // statik dizi fonksiyondan çıkıldığında yaşamaya devam eder. }
Yerel bir değişkenin işaretçisini döndürmek neden tehlikeli?
Cevap: Fonksiyondan çıkıldığında yerel değişkenin belleği serbest bırakılır (yığın alanı). Döndürülen işaretçinin kullanımı belirsiz davranışa yol açar.
Olumsuz Durum
Fonksiyon, yerel bir değişkenin işaretçisini döndürdüğünde, çağıran "çöp" alır, öngörülemeyen davranışlar ve nadir rastlanan hatalarla karşılaşır.
Artılar:
Eksiler:
Olumlu Durum
Döndürülen yapının kullanılması (değer olarak kopyalanır) veya statik/dinamik bellek için işaretçi döndürülmesi:
Artılar:
Eksiler: