2016-12-04 142 views
-1

我的代碼中有一個問題,返回值。在這一部分,返回值被打印好:返回char *值

char *getUserName(){ 

char username[50]; 
DWORD username_len = 50; 
GetUserName(username, &username_len); 
char *returnValue=username; 
printf("user: %s\n\n",returnValue); 
return returnValue;} 


char *getSystemName(){ 

TCHAR szComputerName[256]; 
DWORD cchComputerName = 256; 
GetComputerName(szComputerName, &cchComputerName); 
char *returnValue=szComputerName; 
printf("system: %s",returnValue); 
return returnValue;} 

,但是,當我使用像在主返回值,則返回瘋狂的事情(有時它返回以及系統名):

int main(){ 
char *userName = getUserName(); 
char *systemName = getSystemName(); 

printf("user: %s \n\n",userName); 
printf("system: %s",systemName); 
return 0;} 
+1

字串'username'被分配在堆棧上,而不是在堆,所以當函數返回其值*可能*被覆蓋。你必須在堆上動態地分配它(通過'malloc'),或者在調用者中分配它並傳遞一個指針給它。 – anol

回答

2

這因爲你在getUserName()返回一個指向局部變量導致未定義行爲:

char *returnValue=username; 
... 
return returnValue; 

有兩種方法來解決這個問題:

char *getUserName() 1)更改原型中的'空白getUserName(字符的用戶名[])

您需要調用getUserName

2)保持原型char *getUserName()之前提供緩衝username,但你需要malloc該功能內的username。您還必須手動在main

+0

'char * getSystemName()'同樣的錯誤' –

+0

@WeatherVane是完全一樣的錯誤 – artm

0

我已經解決了使用malloc函數。非常感謝。下面是新的代碼:

char *getUserName(){ 
char username[50]; 
DWORD username_len = 50; 
GetUserName(username, &username_len); 

char *returnValue=(char *)malloc(strlen(username)+1); 
strcpy(returnValue,username); 

return returnValue;} 

與同爲其它功能