1、將函數內部定義的變量用static修飾
由於static修飾的變量,分配在靜態內存區(類似於全局變量區),函數返回時,並不會釋放內存,因此可以將要返回的變量加static修飾。
1 int *test_func() 2 { 3 static int local_data; //加static修飾 4 local_data = 10; 5 6 printf("Function local_data : %d\n", local_data); 7 8 return &local_data; 9 } 10 11 int main() 12 { 13 int *main_data = NULL; 14 15 main_data = test_func(); 16 17 printf("Return data: %d\n", *main_data); 18 19 return 0; 20 }
2、使用分配在堆上的內存
分配在堆上的內存主要指通過malloc、calloc、realloc等函數動態分配的內存,由於堆上的內存需要手動釋放,因此可以在使用完以后再釋放,這樣指針就不會指向未知。
注意:堆上的內存必須要用完即釋放,否則容易造成內存泄漏。
1 int *local_data_test() 2 { 3 int *plocal_data; 4 5 plocal_data = (int *)malloc(sizeof(int)); 6 *plocal_data = 20; 7 8 printf("Function plocal_data value: %d\n", *plocal_data); 9 10 return plocal_data; 11 } 12 13 int main() 14 { 15 int *main_data = NULL; 16 17 main_data = local_data_test(); 18 19 printf("Return data: %d\n", *main_data); 20 free(main_data); 21 main_data = NULL; 22 23 return 0; 24 }
另外一般要返回指針的情況,也可以用全局變量或者傳入指針參數代替。