返回一个在本地声明的指针 wchar_t

Returning a pointer which is a locally declared wchar_t

我已经阅读了很多关于 returning pointers in C 的问题,但我仍然对范围问题感到困惑。

由于调用了 malloc,以下代码可以正常工作,并且一种可能的输出最终可能是 Wide string: Whosebug

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <wchar.h>

static wchar_t *get_new_ptr(char *s)
{
    size_t len = strlen(s);
    wchar_t *ws = NULL;

    ws = malloc((len + 1) * sizeof(wchar_t));
    mbstowcs(ws, s, len);
    ws[len] = '[=11=]';

    return ws;
}

int main(int argc, char *argv[])
{
    wchar_t *wstr = NULL;

    if (argv[1])
        wstr = get_new_ptr(argv[1]);
    wprintf(L"Wide string: %ls\n", wstr);

    return 0;
}

因为 ws 是本地声明的,wchar_t *ws 是否必须是 static 才能安全地 return 到 wstr 的内存地址?

return 一个局部变量是可以的, return 一个指向局部变量的指针是不行的。

int foo(void)
{
    int var = 42;
    return var;   //OK
}

int *bar(void)
{
    int var = 42;
    return &var;  //ERROR
}

在 returning 指针的情况下,重要的是这个指针是否指向函数 returns 之后的有效位置。

在您的代码中,您使用的是动态分配内存,没关系。所以答案是,不,没必要声明为static.