可以像函数类型一样使用char *吗?

时间:2018-03-21 13:02:23

标签: c++ visual-c++

我读到了char *,它应该被使用而不是它我应该只使用char []。它还涉及功能类型吗?我在下面粘贴了我读到的内容和下面的代码。

  

将放置" Hello world"在内存的只读部分,并使s成为指针,使得对此内存的任何写入操作都是非法的   What is the difference between char s[] and char *s?

char* GetModulePath()
{
    char ownPth[MAX_PATH];

    HMODULE hModule = GetModuleHandle(NULL);

    if (hModule != NULL)
    {
        GetModuleFileName(hModule, ownPth, (sizeof(ownPth)));
    }
    return ownPth;
}

还可以吗?也许不是char *我应该使用const chars *? 编辑:添加了本文的链接,我已阅读。

2 个答案:

答案 0 :(得分:1)

是的,没关系,但在你的情况下,你将返回一个指向局部变量的指针(在评论中提到)。

但无论如何,在C ++中你只需这样做:

std::string GetModulePath()
{
    char ownPth[MAX_PATH] = {0};

    HMODULE hModule = GetModuleHandle(NULL);

    if (hModule != NULL)
    {
        GetModuleFileName(hModule, ownPth, sizeof(ownPth));
    }

    return std::string(ownPth);
}

答案 1 :(得分:1)

可以使用"Type of RHS ('double') must match LHS ('logical')返回类型的函数,例如:

RHS

但是,您的代码有问题:您尝试返回本地变量char*,这是一个问题。 在该行:

char* f() {
    char* r = new char[20];
    //Your logic
    return r;
}

int main() {
    char* v = f();
    //More logic
    //Don't forget to delete the dynamically allocated data when you don't need it
    delete[] v;
}

你只需返回指向char数组的第一个元素的指针,它将被"销毁"在函数调用之后,尝试从外部取消引用返回的值将导致未定义的行为。

你应该做的就是使用ownPth

return ownPth;

或者,如果你真的想使用char数组,你应该使用堆分配(std::stringstd::string GetModulePath() { char ownPth[MAX_PATH] = {0}; // Zero initialization HMODULE hModule = GetModuleHandle(NULL); if (hModule != NULL) { GetModuleFileName(hModule, ownPth, (sizeof(ownPth))); } return std::string(ownPth); } ),但我不推荐它:

new

正如下面的评论所说,这是非常糟糕的做法,而且在某些时候,你可能会忘记在使用它之后调用delete,在函数调用之后,创建一个内存泄漏