【问题标题】:Return local character array from a function [duplicate]从函数返回本地字符数组[重复]
【发布时间】:2013-08-26 12:37:45
【问题描述】:

如何从一个函数返回一个本地字符数组

char* testfunction()
{
char array[] = "Hello World";
 return array;
}

char main()
{
 char* array = testfunction();
 printf(" %s -> string", array);
 return 0;
}

此代码导致未知错误

�@$�@ 字符串

【问题讨论】:

  • 改为返回std::string
  • array 大小为 3 不能完全容纳“Hello World”

标签: c++ c string visual-c++ pointers


【解决方案1】:

testfunction() 在 main() 中返回 array 时,您正在返回一个指向局部变量的指针,该指针变为悬空指针。

改用std::string

#include <string>
#include <iostream>

std::string testfunction()
{
    std::string str("Hello World");
    return str;
}

int main()
{
    std::cout << testfunction() << std::endl;
    return 0;
}

【讨论】:

    【解决方案2】:

    你不应该直接返回堆栈变量的地址,因为一旦堆栈帧被移除(函数返回后)它就会被销毁。

    你可以这样做。

    #include <stdio.h>
    #include <algorithm>
    
    char* testfunction()
    {
       char *array = new char[32];
       std::fill(array, array + 32, 0); 
       snprintf(array, 32, "Hello World");
       return array;
    }
    
    int main()
    {
       char* array = testfunction();
       printf(" %s -> string", array);
       delete[] array;
       return 0;
    }
    

    【讨论】:

    • 如果你现在说他应该做什么而不是它甚至是一个答案;)
    • 有机会破坏记忆,
    • 除非您喜欢调试内存泄漏,否则请返回 std::string(或其他一些 RAII 对象),而不是希望调用者知道如何处理哑指针。
    • @MikeSeymour 你是对的,但由于问题是关于从函数返回数组,我给出了这个解决方案。
    【解决方案3】:

    也许,这就是你想要的:

    const char *testfunction(void)
    {
            return "Hello World";
    }
    

    【讨论】:

    • 假设OP不想修改array
    【解决方案4】:

    您不能返回局部变量的地址。 (如果你使用 gcc,你应该会收到一些警告)

    您可以尝试改用关键字static

    char    *test()
    {
      static char array[] = "hello world";
      return (array);
    }
    

    【讨论】:

    • 当有人修改它时,这将导致有趣的错误,并且将来的调用会返回修改后的值。 (如果它不打算被修改,那么数组中根本没有意义 - 只需返回一个 const 指向文字的指针)。
    • 好吧,我们不知道操作员想用它做什么。 Hoover 在操作码中我们只能看到 c 而不是 c++。但是你能解释一下为什么会出现错误吗?
    • 正如我所说:如果有人修改了这个函数返回的数组,那么以后的调用将返回修改后的值。问题中的代码每次都尝试(但失败)返回相同的值;您的代码的行为方式与此惊人地不同。 (我想您可以修改您的版本以每次都重写该值;然后您只需担心重入性和线程安全性)。
    • 我想我对英语的理解还不够好,我不明白操作每次都试图返回相同的值(如何从一个函数返回本地字符数组)此外他声明char* 而不是 const char* 无论如何它是重复的。 (对于不看编译器警告/错误的人)
    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2023-03-17
    • 2014-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多