人生就是这样,笑笑别人,再被别人笑笑。之前笑过别人返回栈指针,没想到,我今天也返回了栈指针,我晕。
别人程序是(有错误):
#include <iostream>
using namespace std;
char * fun()
{
char str[] = "123";
return str;
}
int main()
{
cout << fun() << endl;
return 0;
}
其实,可以勉强改为:
#include <iostream>
#include <string>
using namespace std;
string fun()
{
char str[] = "123";
return str; // 最好是: return string(str);
}
int main()
{
cout << fun() << endl;
return 0;
}
我今天居然写了这样一个程序,晕乎:
#include <iostream>
using namespace std;
void fun(char *s)
{
char str[] = "123";
s = str; // 错误
}
int main()
{
char s[100] = {0};
fun(s);
cout << s << endl;
return 0;
}
应该写成:
#include <iostream>
using namespace std;
void fun(char *s, int n)
{
char str[] = "123";
strncpy(s, str, n - 1);
}
int main()
{
char s[100] = {0};
fun(s, sizeof(s));
cout << s << endl;
return 0;
}
哎,不能大意啊。

本文通过两个示例介绍了C++中从栈内存返回局部变量的常见错误及如何正确地进行字符串的返回与复制。首先展示了直接返回栈上局部字符数组的引用将导致未定义行为的问题,并给出了使用标准库string类型作为返回值的解决方案。其次,讨论了通过函数修改传入字符数组的不当方式,并提供了一个正确的实现方法。
1230

被折叠的 条评论
为什么被折叠?



