Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.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
C++ 返回字符串但得到垃圾_C++_String_Char_Return_Strcpy - Fatal编程技术网

C++ 返回字符串但得到垃圾

C++ 返回字符串但得到垃圾,c++,string,char,return,strcpy,C++,String,Char,Return,Strcpy,我试图从如下函数返回字符串: virtual const char* what() const throw() { std::string str = "Name Error: name "; str+= n_name; str += " is not defined"; char ret[256]=""; const char* temp = str.c_str(); strcpy(ret, temp); return ret; }

我试图从如下函数返回字符串:

virtual const char* what() const throw()
{   
    std::string str = "Name Error: name ";
    str+= n_name;
    str += " is not defined";
    char ret[256]="";
    const char* temp = str.c_str();
    strcpy(ret, temp);
    return ret;
}
但当我尝试在其他地方打印时:

const char* str= exc.what();
std::cout << str;
该程序在某个时间崩溃

strcpy(ret, temp);
有人能帮我吗?
另外,函数必须在
what()
返回时返回一个const char*

,返回值存储在

str
中。数组
ret
将因其作用域而被销毁,从
what()
返回的指针是一个悬空指针,在解除防护时会导致未定义的溢出。您应该
new
数组(并且
在使用它之后删除它),或者在
what()
返回,返回值存储在
str
数组
ret
中,由于它的作用域,该数组将被销毁,从
what()
返回的指针是一个悬空指针,在解除隔离时会导致未定义的bevahiour。您应该
new
数组(并且
在使用它之后删除它),或者只返回
std::string

主要问题来自返回指向局部变量的指针。如果您使用
-Wall
编译器选项(我鼓励您在每次编译时使用该选项),您将获得:

警告:返回的局部变量“ret”的地址[-Wreturn local addr]


实际上,
charret[256]=”是本地函数。在函数的末尾,局部变量不再存在。所以,当std::cout时,每个手动分配的内存都应该手动释放,主要问题来自于返回指向局部变量的指针。如果您使用
-Wall
编译器选项(我鼓励您在每次编译时使用该选项),您将获得:

警告:返回的局部变量“ret”的地址[-Wreturn local addr]


实际上,
charret[256]=”是本地函数。在函数的末尾,局部变量不再存在。因此,当
std::cout每个手动分配的内存都应该手动解除分配时,

看起来您正在尝试实现一个异常。为什么您不直接从
std::runtime\u error
继承,它已经提供了实现这一功能的机制?您只需要将所需的消息传递给它的构造函数


请参见

您似乎正在尝试实现异常。为什么您不直接从
std::runtime\u error
继承,它已经提供了实现这一功能的机制?您只需要将所需的消息传递给它的构造函数


请参见

返回指向无效内存的指针。您需要分配一些内存,指针将指向这些内存。请参阅“malloc”或“new[]”。返回指向无效内存的指针。您需要分配一些内存,指针将指向这些内存。请参阅“malloc”或“new[]”。您确定char ret[256]=“分配内存吗?它与指向只读静态内存的char*ret=“”有何不同?
char-ret[256]=“
自动在堆栈上为256
char
分配内存,并将其初始化为
。取消分配在功能结束时自动完成。非常感谢!现在可以了!您确定char-ret[256]=“分配内存吗?”?它与指向只读静态内存的char*ret=“”有何不同?
char-ret[256]=“
自动在堆栈上为256
char
分配内存,并将其初始化为
。取消分配在功能结束时自动完成。非常感谢!现在可以了!这就是任务的一部分——创建异常。不管怎样,谢谢。如果你问你真正的问题,你可能会得到更好的答案。但我认为您可能会发现这很有用:这是任务的一部分——创建异常。不管怎样,谢谢。如果你问你真正的问题,你可能会得到更好的答案。但我想你可能会发现这很有用:谢谢,我找到了一个方法!谢谢,我找到办法了!
strcpy(ret, temp);
char * ret = new char[str.size()+1];