【问题标题】:Return char * value返回字符 * 值
【发布时间】:2017-04-19 04:58:26
【问题描述】:

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

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 返回值时,它会返回疯狂的东西(有时它会返回很好的系统名称):

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

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

【问题讨论】:

  • 字符串username分配在栈上,而不是堆上,所以当函数返回时,它的值可能被覆盖。您必须要么在堆上动态分配它(通过malloc),要么在调用者中分配它并传递一个指向它的指针。

标签: c function pointers char return-value


【解决方案1】:

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

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

有两种方法可以解决这个问题:

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

在调用getUserName之前,您需要提供一个缓冲区username

2) 保留原型char *getUserName(),但您需要在该函数中使用malloc username。另外你必须手动free username in main

【讨论】:

  • char *getSystemName()同样的错误
  • @WeatherVane 是的,完全一样的错误
【解决方案2】:

我已经用 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;}

其他功能也一样

【讨论】:

    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 2021-09-13
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多