C4700:组合路径时未初始化的局部变量

时间:2014-08-04 10:50:52

标签: c windows winapi visual-c++

运行此代码时:

TCHAR *getSettingsFilePath(TCHAR *defaultProfilePath)
{
    TCHAR *prefPath;
    PathCombine(prefPath, defaultProfilePath, "profile.xml");
    return prefPath;  // This returns valid path
}

编译器抛出警告说:警告C4700:未初始化的本地变量prefPath已使用

PathCombine函数将prefPath设置为所需的路径。

但是当我在运行prefPath之前尝试将NULL初始化为PathCombine时,编译器警告消失了,但我的函数也返回NULL

TCHAR *getSettingsFilePath(TCHAR *defaultProfilePath)
{
    TCHAR *prefPath = NULL;
    PathCombine(prefPath, defaultProfilePath, "profile.xml");
    return prefPath; // This will return NULL
}

我在这里想念什么?初始化此指针的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

PathCombine函数写入prefPath所指向的空间。您的第一个版本似乎只能工作,因为偶然的prefPath指向的随机位置恰好是您可以访问的空间,而其他任何东西都不依赖于它(无论如何,您注意到了)。 / p>

它没有分配空间。事实上它不能。参数按值传递,因此函数不能对指针prefPath进行任何更改。一定要在心理上区分这两件事:指针指向的事物

所以你需要分配一些空间。在C ++中,这对于函数来说是一个糟糕的设计,因为它需要调用者参与内存管理。从你的标签中不清楚你是用C语言还是用C ++编写的(那些是不同的语言)。

暂时假设C,那么你需要pick a dynamic allocation function,并且还记录调用代码完成后必须释放已分配的内存。

可能更好的设计是让调用者在正确大小的缓冲区中传递(而不是返回指向动态分配的指针)。这使得呼叫者可以选择是否需要自动分配或动态分配;以及使用哪种动态分配功能。

相关问题