【问题标题】:C4700: uninitialized local variable when combining pathC4700:组合路径时未初始化的局部变量
【发布时间】:2014-09-26 19:50:42
【问题描述】:

运行此代码时:

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

编译器抛出警告:warning C4700: uninitialized local variable prefPath used

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

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

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

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

【问题讨论】:

  • From the documentation: "您必须将此缓冲区的大小设置为 MAX_PATH 以确保它足够大以容纳返回的字符串。"并且由于您要返回它,因此最好是动态的或由调用者传入(通常首选后者)。
  • TCHAR *prefPath = (TCHAR*)calloc(MAX_PATH, sizeof(TCHAR));

标签: c windows winapi visual-c++


【解决方案1】:

PathCombine 函数写入prefPath 指向的空间。您的第一个版本似乎只能工作,因为碰巧prefPath 指向的随机位置恰好是您可以访问的空间,并且没有其他依赖于它(无论如何,您注意到了)。

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

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

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

更好的设计可能是让调用者传入一个大小合适的缓冲区(而不是返回指向动态分配的指针)。这让调用者可以选择是自动分配还是动态分配;以及使用哪个动态分配函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多