2012-07-17 71 views
1

我寫了下面:字符串和字符串函數用C

#include <stdio.h> 
#include <string.h> 
char* getString(); 

char* getString(){ 
    char str[10]; 
    gets(str); 
    return str; 

} 

int main() { 

    char* s; 
    s=getString(); 
    strcpy(s,"Hi"); 
    puts(s); 
    return 0; 
} 

我知道的str長度必須小於10少,但即使當我寫只是「嗨」,正在打印什麼。據我所知,它應該是好的。編譯器說fgets is dangerous and should not be used

什麼原因沒有在屏幕上打印?

+7

你返回本地...不要做... :)我很驚訝,編譯器是不是給你一個警告。 – Mysticial 2012-07-17 06:47:58

+0

相關:http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope – Flexo 2012-07-17 06:50:30

回答

6
char str[10]; 
// ... 
return str; 

這是錯!!!局部變量在其範圍退出時失效;因此使用返回數組是未定義的行爲。你必須malloc的字符串,並將其返回:

return strdup(str); 
+0

@Flexo修復它 – 2012-07-17 06:56:12

+1

當你調用函數getString它分配10個字節爲str中你從stdin中使用gets獲取數據。現在,當你返回並退出函數時,str所指向的10bytes內存將變爲無效。所以,你不應該再使用它了。 – Shubhansh 2012-07-17 07:01:35

+0

你的意思是這樣的嗎? char * getString(){ \t \t char * s; \t s =(char *)malloc(sizeof(char)* 10); \t gets(s); \t return s; \t } 但是這裏也是這個函數的局部變量,不是嗎?所以更多的是因爲內存不被保存? – Numerator 2012-07-17 07:03:30

1

讓你的代碼的工作,但不一定是最好的方式的最簡單的方法,就是讓str靜態的。

即關於導致

static char str[10]; 
3

問題已經被討論。您可以執行的解決方案列表包括:

1)。將str全局定義爲「char str [10]」,並將其用於main函數和getString中。在函數getString中使用malloc/calloc,代碼就像這樣...

char* getString(){ 
char *str = NULL; 
str = (char *)calloc(10, sizeof(char)); 
gets(str); 
return str; 
} 

int main() { 
    char* s; 
    s=getString(); 
    strcpy(s,"Hi"); 
    puts(s); 
    free(s); 
    return 0; 
}` 

3)。使用靜態即可獲得幫助。但它在概念上不正確。

例如,聲明爲在功能如下的GetString

static char str[10]; 
+0

你是否必須在getString中初始化str?它沒有默認的初始化值「0」(在我們的例子中相當於Null)? – Numerator 2012-07-17 07:17:17

+0

你在說什麼是編譯器依賴。一些編譯器初始化爲零而有些編譯器可能導致垃圾值。所以它總是很好的初始化以避免不可預知的行爲。 – Shubhansh 2012-07-17 07:21:14

+0

sizeof(char),從malloc&co轉換返回值時,gets和strcpy在閱讀作業應用程序中的示例代碼時都是很好的過濾器。如果有人試圖學習教他們良好的做法,這將是很好的。 – Art 2012-07-17 07:49:31

0

str[10]是的堆棧上分配10個字符的陣列。功能超出範圍後,堆棧將被刪除。因此函數getString()返回的地址不再有效。

考慮聲明一個指針char *str並動態分配內存malloc。現在,您的變量指向中的某個位置,即使該功能執行完畢後該位置仍然保持不變。

希望這回答了你的問題