运行此代码时:
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
}
我在这里想念什么?初始化此指针的正确方法是什么?
答案 0 :(得分:1)
PathCombine
函数写入prefPath
所指向的空间。您的第一个版本似乎只能工作,因为偶然的prefPath
指向的随机位置恰好是您可以访问的空间,而其他任何东西都不依赖于它(无论如何,您注意到了)。 / p>
它没有分配空间。事实上它不能。参数按值传递,因此函数不能对指针prefPath
进行任何更改。一定要在心理上区分这两件事:指针,指向的事物。
所以你需要分配一些空间。在C ++中,这对于函数来说是一个糟糕的设计,因为它需要调用者参与内存管理。从你的标签中不清楚你是用C语言还是用C ++编写的(那些是不同的语言)。
暂时假设C,那么你需要pick a dynamic allocation function,并且还记录调用代码完成后必须释放已分配的内存。
可能更好的设计是让调用者在正确大小的缓冲区中传递(而不是返回指向动态分配的指针)。这使得呼叫者可以选择是否需要自动分配或动态分配;以及使用哪种动态分配功能。