通过引用传递时误解某些内容(C结构)

通过引用传递时误解某些内容(C结构),c,pointers,struct,reference,C,Pointers,Struct,Reference,我正在做一些基本的C代码,遇到了一个我无法理解的问题。因此,我目前的设置是,我有一个简单的结构: struct UserInfo { WCHAR* UserName; WCHAR* ComputerName; } 在我的main中,我想创建该结构的一个实例,通过引用将该结构传递给两个函数,每个函数将填充两个字段中的一个。我的主要代码是: void main() { struct UserInfo userInfo; GetUserName(&userInfo)

我正在做一些基本的C代码,遇到了一个我无法理解的问题。因此,我目前的设置是,我有一个简单的结构:

struct UserInfo
{
   WCHAR* UserName;
   WCHAR* ComputerName;
}
在我的main中,我想创建该结构的一个实例,通过引用将该结构传递给两个函数,每个函数将填充两个字段中的一个。我的主要代码是:

void main()
{
   struct UserInfo userInfo;

   GetUserName(&userInfo);
   GetComputerName(&userInfo);

   return 0;
}
这两项功能如下:

BOOL GetUserName(struct UserInfo* userInfo)
/*
Function calls the winapi function GetUserNameW to return the current
username in widechar format.
*/
{
    WCHAR UserName[USERNAME_MAXSIZE + 1];
    DWORD UserNameSize = USERNAME_MAXSIZE + 1;

    if (!GetUserNameW(UserName, &UserNameSize))
    {
        if (&UserNameSize != USERNAME_MAXSIZE + 1)
        {
            if (!GetUserNameW(UserName, &UserNameSize)) return FALSE;
        }
        else return FALSE;
    }
    userInfo->UserName = UserName;

    return TRUE;
}

我遇到的问题是,当调用第二个函数时,第一个值中存储的数据似乎被覆盖。例如,当浏览代码时,第一个函数用指向我的系统用户名的指针正确地填充userInfo->UserName

当第二个函数名为user userInfo->UserName时,第二个函数运行正常,userInfo->ComputerName被正确填充。我不明白为什么会这样?如果我将这些函数合并成这样一个函数:

BOOL GetData(struct UserInfo* userInfo)
{
    WCHAR UserName[USERNAME_MAXSIZE + 1];
    DWORD UserNameSize = USERNAME_MAXSIZE + 1;
    LPWSTR ComputerBuffer[MAX_PATH];
    DWORD ComputerBufferSize = MAX_PATH;

    if (!GetUserNameW(UserName, &UserNameSize))
    {
        if (&UserNameSize != USERNAME_MAXSIZE + 1)
        {
            if (!GetUserNameW(UserName, &UserNameSize)) return FALSE;
        }
        else return FALSE;
    }
    userInfo->UserName = UserName;

    if (!GetComputerNameW(ComputerBuffer, &ComputerBufferSize))
    {
        if (&ComputerBufferSize != MAX_PATH)
        {
            if (!GetComputerNameW(ComputerBuffer, &ComputerBufferSize)) return FALSE;
        }
        else return FALSE;
    }

    userInfo->ComputerName = ComputerBuffer;

    return TRUE;
}
这一切都如期进行,我是否误解了关于引用传递的某些内容?根据我的理解,userInfo基本上是传递一个指向我的结构的指针,userInfo->somefield实际上是在修改我的结构,而不是像传递值那样的复制结构。我不明白为什么当把同一个结构传递给不同的函数,每个函数修改一个不同的字段时,它们会相互干扰


提前感谢您对这一点的帮助。

在函数中,数组
UserName
ComputerBuffer
是非静态的本地数组。这意味着它们的生命在从函数返回时结束,因此在从函数返回后不能使用指向它们的指针

您应该在堆上分配一些缓冲区,以便数据在返回时不会被擦除

您还应该使用
WCHAR
,而不是
LPWSTR
,作为
ComputerBuffer
的元素,因为要分配的成员
ComputerName
具有类型
WCHAR*

而不是这些:

    WCHAR UserName[USERNAME_MAXSIZE + 1];
    DWORD UserNameSize = USERNAME_MAXSIZE + 1;
你应该这样做:

    DWORD UserNameSize = USERNAME_MAXSIZE + 1;
    WCHAR *UserName = malloc(sizeof(*UserName) * UserNameSize);
你应该加上

#include <stdlib.h>
#包括

如果malloc()不存在,则使用它。

您正在存储指向局部变量(字符串数组)的指针。当您退出函数(或它们定义的块)时,它们不再存在。并且它们的内存可能会被用于其他目的。当您使用完ITA后,不要忘记调用分配的内存上的
free
。谢谢,这是有意义的,因为我的结构类型是wchar*我正在用指向非静态本地数组的指针填充字段,这些数组在函数结束后超出范围。
    DWORD UserNameSize = USERNAME_MAXSIZE + 1;
    WCHAR *UserName = malloc(sizeof(*UserName) * UserNameSize);
    DWORD ComputerBufferSize = MAX_PATH;
    WCHAR *ComputerBuffer = malloc(sizeof(*ComputerBuffer ) * ComputerBufferSize);
#include <stdlib.h>