2016-12-04 137 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;} 

与同为其它功能