返回一个在本地声明的指针 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
.
我已经阅读了很多关于 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
.