Pertanyaan mengembalikan variabel lokal dari fungsi dalam C [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

#include <stdio.h>

int foo1(void)
{
    int p;
    p = 99;
    return p;
}

char *foo2(void)
{
    char buffer[] = "test_123";
    return buffer;
}

int *foo3(void)
{
    int t[3] = {1,2,3};
    return t;
}

int main(void)
{
    int *p;
    char *s;

    printf("foo1: %d\n", foo1());
    printf("foo2: %s\n", foo2());
    printf("foo3: %d, %d, %d\n", p[0], p[1], p[2]);
    return 0;
}

Ketika saya mengkompilasi ini dengan gcc -ansi -pedantic -W -Wall kompilator mengeluarkan pesan peringatan untuk foo2 () dan foo3 ():

warning: function returns address of local variable

Saya pikir itu tidak diizinkan untuk mengembalikan variabel lokal, tetapi foo1 () berfungsi dengan baik dan tampaknya ada perbedaan besar antara mengembalikan pointer ke objek lokal dan objek itu sendiri.

Adakah yang bisa menjelaskan beberapa hal tentang masalah ini? Terima kasih sebelumnya!


32
2018-01-28 02:43


asal


Jawaban:


Masalahnya di sini adalah bahwa ketika Anda membuat variabel lokal itu dialokasikan pada stack dan karena itu tidak tersedia setelah fungsi selesai eksekusi (implementasi bervariasi di sini). Cara yang lebih baik akan digunakan malloc() untuk memesan memori non-lokal. bahayanya di sini adalah Anda harus menanggalkan (free()) semua yang Anda alokasikan menggunakan malloc(), dan jika Anda lupa, Anda membuat kebocoran memori.


21
2018-01-28 02:49



Untuk foo1(), Anda mengembalikan a salinan dari variabel lokal, bukan variabel lokal itu sendiri.

Untuk fungsi lainnya, Anda mengembalikan salinan penunjuk ke variabel lokal. Namun, variabel lokal tersebut tidak dapat digunakan ketika fungsi selesai, sehingga Anda berakhir dengan masalah buruk jika Anda mencoba untuk merujuknya setelahnya.


16
2018-01-28 02:48



Setiap variabel memiliki beberapa ruang dalam memori. Pointer referensi ruang itu. Ruang yang dihuni oleh variabel lokal dinonaktifkan ketika fungsi panggilan kembali, yang berarti dapat dan akan digunakan kembali untuk hal-hal lain. Sebagai akibatnya, referensi ke ruang itu akan berakhir menunjuk pada sesuatu yang sama sekali tidak berhubungan. Array dalam C diimplementasikan sebagai pointer, jadi ini berlaku untuk mereka. Dan array konstan dideklarasikan dalam fungsi juga dianggap sebagai lokal.

Jika Anda ingin menggunakan array atau pointer lain di luar ruang lingkup fungsi yang dibuat, Anda perlu menggunakan malloc untuk memesan ruang untuk itu. Ruang yang disediakan menggunakan malloc tidak akan dialokasikan ulang atau digunakan kembali sampai secara eksplisit dirilis dengan menelepon gratis.


5
2018-01-28 02:46



Ya, Anda mengembalikan larik, yang sebenarnya adalah penunjuk di belakang layar, ke alamat lokasi memori tempat konten variabel yang telah Anda jalankan disimpan. Jadi itu memperingatkan Anda bahwa mungkin tidak cukup berguna untuk mengembalikan hasil seperti itu, ketika Anda mungkin benar-benar berarti salah satu dari nilai-nilai larik sebagai gantinya.


0
2018-01-28 02:49