【问题标题】:Returning a pointer which is a locally declared wchar_t返回一个本地声明的 wchar_t 指针
【发布时间】:2015-08-31 17:01:23
【问题描述】:

我已经阅读了很多关于在 C 中返回指针的问题,但仍然对范围问题感到困惑。

由于调用了malloc,以下代码有效,并且一个可能的输出最终可能是Wide string: StackOverflow

#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] = '\0';

    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 才能安全地将内存地址返回给wstr

【问题讨论】:

    标签: c static scope return


    【解决方案1】:

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

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

    在返回指针的情况下,重要的是该指针是否指向函数返回后的有效位置。

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

    【讨论】:

    • 在返回一个指针的情况下,重要的是这个指针在函数返回后是否指向一个有效的地方。 所以在你的第二个例子中,引用返回*bar 函数返回后就不存在了吧?
    • @HughMcMaster 正确。
    猜你喜欢
    • 2016-08-04
    • 2014-08-02
    • 2018-11-11
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多