运行此代码时:

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
}


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

最佳答案

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

它不分配空间。其实不行。参数是通过值传递的,因此该函数无法对指针prefPath进行任何更改。请确保从心理上区分两件事:指针和所指对象。

因此,您需要分配一些空间。在C ++中,对于函数而言,这是一个较差的设计,因为它要求调用者参与内存管理。从标记中尚不清楚您是使用C还是C ++(这些语言是不同的语言)进行编码。

假设当前为C,则需要pick a dynamic allocation function,并记录调用代码在完成分配的内存后必须释放它。

可能更好的设计是使调用者在正确大小的缓冲区中传递(而不是将指针返回到动态分配)。这样,呼叫者就可以选择是自动分配还是动态分配。以及要使用的动态分配功能。

关于c - C4700:合并路径时未初始化的局部变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25116987/

10-12 16:07