2017-04-13 76 views
-1
#include <string.h> 
#include <stdio.h> 

char *in() { 
    char a[10]; 
    scanf("%s",a); 
    return (a); 
} 

int main() { 
    char *a; a=in(); 
    printf("\n%s",a); 
    return (0); 
} 

回答

3

在你的代碼,

return (a); 

是返回一個局部變量的地址的嘗試。在呼叫者中,地址的任何用法(試圖訪問)將導致undefined behavior,因爲內存地址是無效

函數返回後,函數內的局部變量將不再存在,它們的生命期終止。因此,與這些變量(對象)對應的地址變爲無效。按照C11,章第6.2.4節

[...]如果一個對象被稱爲它的壽命之外,則該行爲是未定義的。指針的值在其指向的對象(或剛剛過去)達到其生命週期結束時變得不確定。

注:這就是說,我個人除了::return是一個關鍵字,請不要使它看起來像一個功能。

解決方案:你需要確保其正在返回的地址變量的壽命,替代的功能範圍,所以你可以

  • 使用malloc()和家庭分配內存
  • 使用變量與static存儲。
+1

而不是重複回答非常常見的常見問題,如何開始關閉他們作爲重複,而不是?這個問題有2個規範重複:[指向本地變量](http://stackoverflow.com/questions/4570366/pointer-to-local-variable),當OP不知道他們在做什麼和[本地可以當OP知道這是錯誤的時,變量的內存是否在其範圍之外被訪問?](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)但想知道爲什麼「似乎有效」。 – Lundin

0

不返回本地變量指針。使用全局替代或靜態。

char *in() { 
    static char a[10]; 
    scanf("%s",a); 
    return (a); 
} 

int main() { 
    char *a; a=in(); 
    printf("\n%s",a); 
    return (0); 
}