运行此代码时:
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/