我有以下代码.
#include <iostream>
int * foo()
{
int a = 5;
return &a;
}
int main()
{
int* p = foo();
std::cout << *p;
*p = 8;
std::cout << *p;
}
Run Code Online (Sandbox Code Playgroud)
而代码只是运行而没有运行时异常!
输出是 58
怎么会这样?本地变量的内存不能在其功能之外无法访问吗?
我有一个返回字符串的函数.但是,当我调用它并对其执行c_str()以将其转换为const char*时,它仅在我首先将其存储到另一个字符串时才起作用.如果我直接从函数中调用c_str(),它会将垃圾值存储在const char*中.
为什么会这样?感觉我在这里遗漏了一些非常基本的东西......
string str = SomeFunction();
const char* strConverted = str.c_str(); // strConverted stores the value of the string properly
const char* charArray= SomeFunction().c_str(); // charArray stores garbage value
static string SomeFunction()
{
string str;
// does some string stuff
return str;
}
Run Code Online (Sandbox Code Playgroud) 给定一个简单的文件加载功能,
std::string load_file(const std::string &filename) {
std::ifstream file(filename);
std::string line;
std::stringstream stream;
while (std::getline(file, line)) {
stream << line << "\n";
}
return stream.str();
}
Run Code Online (Sandbox Code Playgroud)
为什么以下打印another_file两次内容?
const char *some_file = load_file("some_file").c_str();
const char *another_file = load_file("another_file").c_str();
printf("%s", some_file);
printf("%s", another_file);
Run Code Online (Sandbox Code Playgroud) 我有一个定义如下的方法:
const std::string returnStringMethod()
{
std::string myString;
// populate myString
return myString;
}
Run Code Online (Sandbox Code Playgroud)
现在,在调用者中,我做了类似这样的事情:
const char * ptr = returnStringMethod().c_str();
Run Code Online (Sandbox Code Playgroud)
正如我所看到的,这是返回一些我没想到的截断字符串.但是,以下工作正常:
std::string str = returnStringMethod();
const char * ptr = str.c_str();
Run Code Online (Sandbox Code Playgroud)
有人可以帮我理解这里发生的事情吗?.
PS:我们每周构建一次代码.我上周提交代码时测试了这个,事情还不错.所以,我真的想知道我在这里可能缺少什么.
谢谢,帕万.
代码:
stringstream ss("012345678901234567890123456789012345678901234567890123456789");
Run Code Online (Sandbox Code Playgroud)
一些文章说由于ss.str返回临时对象而导致后续使用是错误的,并且在调用之前会被破坏.c_str();
const char* cstr2 = ss.str().c_str();
Run Code Online (Sandbox Code Playgroud)
但我运行的例子,没有问题?如何理解?
我正在将我的项目从Visual Studio 06移动到2010.在这样做时,我在我的代码中观察到了这种行为.我有一个Get字符串函数,如下所示:
string GetTheStr()
{
return strSomeStdString;
}
Run Code Online (Sandbox Code Playgroud)
然后有另一个函数调用上面的get函数,如下所示:
const char* ptrStr = (char *)GetTheStr().c_str();
Run Code Online (Sandbox Code Playgroud)
ptrStr指向的字符串的值是""
上面的代码在visual studio 06中运行良好,但在visual studio 2010上却没有.
然后我尝试了几个实验:
std::string str = GetTheStr(); // -> value inside str displayed correctly
const char* PtrCStr = str.c_str(); // -> value pointed by PtrCStr displayed correctly
const char* PtrData = str.data(); // -> value pointed by PtrData displayed correctly
const char* ptr = (char *)GetTheStr().c_str(); // -> value pointed by ptr NOT displayed correctly
Run Code Online (Sandbox Code Playgroud)
我想知道为什么最后一行不起作用.任何人都可以告诉我为什么上面的行为发生在Visual Studio 2010而不是视觉工作室06?
提前致谢 :)