函数返回char* 的解决方案

在C语言中,自动变量在堆栈中分配内存。当包含自动变量的函数或代码块退出时,它们所占用的内存便被回收,它们的内容肯定会被下一个所调用的函数覆盖。这一切取决于堆栈中先前的自动变量位于何处,活动函数声明了什么变量,写入了什么内容等。原先自动变量地址的内容可能被立即覆盖,也可能稍后才被覆盖。

  解决方案:

  1. 返回一个指向字符串常量的指针。例如:

char* func() {
        return "Only works for simple strings";
} 

  这是最简单的解决方案,但如果你需要计算字符串的内容,它就无能为力了,在本例中就是如此。如果字符串常量存储于只读内存区,但以后需要改写它时,你就会有麻烦了。

 

  2. 使用全局声明的数组。

char* fun() {
.................
global_array[i] = ....;
return global_array;
}

  这适用于自己创建字符串的情况,也很简单易用。它的缺点在于任何人都有可能在任何地方任何时候修改这个全局数组。

 

  3. 静态数组。例如:

char* func() {
static char buffer[25];
...
return buffer;
}

  这就可以防止任何人任何时候修改这个数组。只有拥有指向该数组的指针的函数(通过参数传递给它)才能修改这个静态数组。但是,该函数的下一次调用将覆盖这个数组的内容,所以调用者必须在此之前使用或者备份数组的内容。和全局数据一样,大型缓冲区如果闲置不用是非常浪费内存空间的。

 

  4. 显式分配一些内存,保存返回的值。例如:

char* func() {
char *s = malloc(120);
...
return s;
}

  这个方法具有静态数组的优点,而且在每次调用时都创建一个新的缓冲区,所以该函数以后的调用不会覆盖以前的返回值。它适用于多线程的代码。它的缺点在于程序猿必须承担内存管理的责任。根据程序的复杂程度,这项任务可能很容易,也可能很复杂。如果内存尚在使用就释放或者出现“内存泄露”(不再使用的内存未回收),就会产生令人难以置信的Bug。人们非常容易释放已分配的内存。

   5. 也许最好的解决方案就是要求调用者分配内存来保存函数的返回值。为了提高安全性,调用者应该同时指定缓冲区的大小。

复制代码
void func(char *result, int size)
{
       ...
      strncpy(result, "That' d be in the data segment, Bob", size);

}

buffer = malloc (size);
func(buffer);
...
free(buffer);
复制代码

  如果程序员在同一块代码中同时进行“malloc” 和“free”操作,内存管理最为轻松。

   6. const char* 返回

复制代码
//错误
char* Func(void)
{
    char str[] = "hello world";
    return str;
}

//正确
const char* Func(void)
{
    const char* p = "hello world";//字符串常量存放在程序的静态数据区
    return p;
}
  • 8
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用VS Code时,出现 `cannot convert TCHAR* {aka char*} to const wchar_t*` 错误,这是因为在编译过程中涉及到了字符编码的转换问题。TCHAR是一种根据字符集定义的宏,根据不同的配置,它可以表示char类型或wchar_t类型。 对于此错误,可能是由于将一个TCHAR*(char*)类型的变量传递给一个期望接收const wchar_t*类型参数的函数或方法导致的。解决这个问题的方法之一是进行显示的字符编码转换。 你可以使用`MultiByteToWideChar`函数char*类型的字符串转换为wchar_t*类型。这个函数可以在Windows API中找到,它可以将多字节字符转换为宽字符。以下是一个简单的示例代码: ```cpp #include <windows.h> wchar_t* ConvertToWideChar(const char* str) { int bufferSize = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0); wchar_t* wideCharStr = new wchar_t[bufferSize]; MultiByteToWideChar(CP_UTF8, 0, str, -1, wideCharStr, bufferSize); return wideCharStr; } int main() { const char* narrowStr = "Hello, World!"; wchar_t* wideStr = ConvertToWideChar(narrowStr); // 使用wideStr进行操作 delete[] wideStr; return 0; } ``` 在这个示例中,`ConvertToWideChar`函数将一个char*类型的字符串转换为wchar_t*类型的字符串,并返回转换后的宽字符字符串。你可以将此宽字符字符串传递给接受const wchar_t*类型参数的函数。 希望这个解决方案对你有帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值