2014-08-29 52 views
1

這裏是程序我有一個問題:函數指針和內存管理使用C

#include<stdio.h> 
#include<stdlib.h> 

int * function1(int); 
int * function2(int); 

int main(void) 
{ 
    int * result1,* result2; 
    int val = 1000; 
    result1 = function1(val); 
    fprintf(stderr,"result1 = %d\n", *result1); 
    result2 = function2(val); 
    fprintf(stderr,"result2 = %d\n", *result2); 
    fprintf(stderr,"result1 = %d\n", *result1); 
} 

int * function1(int val) 
{ 
    int result = val + 1500; 
    return &result; 
} 

int * function2(int val) 
{ 
    int result = val - 1500; 
    return &result; 
} 

所以result1初始設置爲2500,並且result2是-500。但是,初始化代碼後,代碼未觸及result1,但它從2500更改爲其他內容。任何人都可以給我任何提示,爲什麼會發生這種情況?

+2

代碼中沒有函數指針。也許你的意思是返回指針的函數? (函數指針是指向函數的指針。) – zindorsky 2014-08-29 15:07:43

+1

爲什麼這些函數完全返回指針?爲什麼不直接簡單地'結果'?在那種情況下,根本沒有問題。 – 2014-08-29 15:09:54

+0

好奇的是,爲什麼發佈「從2500更改爲其他內容」而不是「從2500更改爲X」? X是你看到的價值。 – chux 2014-08-29 15:22:17

回答

2

result是你的兩個函數中的一個自動局部變量。一旦函數終止,它將不再存在。返回指向自動局部變量的指針無效。
編譯器應該提出警告:

[Warning] function returns address of local variable [enabled by default] 

一個可行的辦法是,你可以聲明result作爲

static int result; 

,然後你可以返回指針。


注:有一個在你的代碼中沒有函數指針。

+0

是的,也就是變量'result'只存在於本地範圍內 – 2014-08-29 15:06:44

+0

爲什麼需要指針呢?直接返回結果要容易得多:'int function1(int);'和'return result;'。 – 2014-08-29 15:08:22

+0

@RudyVelthuis;向OP詢問這個問題。我只是指出了錯誤並提出了一個可能的解決方案。 – haccks 2014-08-29 15:09:31

3

result的內容在從函數返回後將不再可用,因爲局部變量在堆棧上分配(並在函數返回後「彈出」)。


嘗試通過動態地使用malloc /釋放calloc分配存儲器:

int * function1(int val) 
{ 
    int *result = malloc(sizeof(int)); 
    *result = val + 1500; 
    return result; 
} 
+0

...然後當你完成後用'free'釋放。 – CoffeeandCode 2014-08-29 16:38:41

2

結果變量僅在局部範圍內可用。

你可以做的是這樣的:

#include<stdio.h> 
#include<stdlib.h> 

int * function1(int); 
int * function2(int); 

int main(void) 
{ 
    int * result1,* result2; 
    int val = 1000; 
    result1 = function1(val); 
    fprintf(stderr,"result1 = %d\n", *result1); 
    result2 = function2(val); 
    fprintf(stderr,"result2 = %d\n", *result2); 
    fprintf(stderr,"result1 = %d\n", *result1); 
    free(result2); 
    free(result1); 
} 

int * function1(int val) 
{ 
    int *result = malloc(sizeof(int)); 
    *result = val + 1500; 
    return result; 
} 

int * function2(int val) 
{ 
    int *result = malloc(sizeof(int)); 
    *result = val - 1500; 
    return result; 
} 

因此,在這種方式,你將永遠在你的變量的結果。

2

result變量在function1function2中的塊範圍。 因此在執行function1function2之後,result變量不再存在。