Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回一个本地声明的wchar\t指针_C_Static_Scope_Return - Fatal编程技术网

返回一个本地声明的wchar\t指针

返回一个本地声明的wchar\t指针,c,static,scope,return,C,Static,Scope,Return,我已经读了很多关于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_

我已经读了很多关于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;
}
#包括
#包括
#包括
#包括
静态wchar\u t*get\u new\u ptr(字符*s)
{
尺寸长度=标准长度;
wchar_t*ws=NULL;
ws=malloc((len+1)*sizeof(wchar_t));
mbstowcs(西、南、北);
ws[len]='\0';
返回ws;
}
int main(int argc,char*argv[])
{
wchar_t*wstr=NULL;
if(argv[1])
wstr=获取新的ptr(argv[1]);
wprintf(L“宽字符串:%ls\n”,wstr);
返回0;
}

因为
ws
是本地声明的,所以
wchar_*ws
是否被定义为
静态的
要将内存地址安全地返回到
wstr

可以返回局部变量,但不能返回指向局部变量的指针

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

int *bar(void)
{
    int var = 42;
    return &var;  //ERROR
}
在返回指针的情况下,重要的是该指针是否在函数返回后指向有效位置


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

在返回指针的情况下,重要的是该指针是否在函数返回后指向有效位置。因此,在第二个示例中,
*bar
返回的引用在函数返回后不再存在,对吗?@HughMcMaster Correct。