C 返回字符*值

C 返回字符*值,c,function,pointers,char,return-value,C,Function,Pointers,Char,Return Value,我的代码中有一个返回值问题。在这一部分中,返回值打印得很好: 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(){

我的代码中有一个返回值问题。在这一部分中,返回值打印得很好:

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;}
但是,当我在main中使用like返回值时,它会返回疯狂的东西(有时它会返回很好的系统名):


这是因为您在
getUserName()
中返回了指向局部变量的指针,这导致了未定义的行为:

char *returnValue=username;
...
return returnValue;
有两种方法可以解决此问题:

1) 将char*getUserName()的原型更改为`void getUserName(char username[])

在调用
getUserName


2) 保留prototype
char*getUserName()
,但您需要在该函数中
malloc
username
。您还必须手动
free
username
main

中使用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;}

另一个函数也是一样的

char*getSystemName()
@WeatherVane是完全相同的错误字符串
username
是在堆栈上分配的,而不是在堆上,因此当函数返回时,其值可能会被覆盖。您必须在堆上动态地分配它(通过
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;}