Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ VC++;函数字符串::c#u str():第一个字节的地址设置为0(与g+;+;)_C++_Visual C++_G++_C Str - Fatal编程技术网

C++ VC++;函数字符串::c#u str():第一个字节的地址设置为0(与g+;+;)

C++ VC++;函数字符串::c#u str():第一个字节的地址设置为0(与g+;+;),c++,visual-c++,g++,c-str,C++,Visual C++,G++,C Str,我在尝试获取字符串函数c_str()的结果时遇到了一个奇怪的问题,该函数的结果与g++不一致 有一个名为Test的函数返回字符串实例。我想使用char*类型来存储结果(这是必需的)。如您所见,函数很简单,返回字符串“resultstring”。但当我试图得到结果时,奇怪的事情发生了 我得到的结果是第二部分中的“”。第一部分和第三部分都返回“resultstring”。而在VisualStudio中。使用g++编译的同一代码的三部分都返回“result”字符串。我们最好先看看结果: vs结果: 地

我在尝试获取字符串函数
c_str()
的结果时遇到了一个奇怪的问题,该函数的结果与g++不一致

有一个名为Test的函数返回字符串实例。我想使用
char*
类型来存储结果(这是必需的)。如您所见,函数很简单,返回字符串“resultstring”。但当我试图得到结果时,奇怪的事情发生了

我得到的结果是第二部分中的“”。第一部分和第三部分都返回“resultstring”。而在VisualStudio中。使用g++编译的同一代码的三部分都返回“result”字符串。我们最好先看看结果:

vs结果:

地址:16841988

结果字符串

地址:16842096

“这是一条空行”

地址:16842060

地址:16842144

地址:16842396

地址:16842396

结果字符串

g的结果++

地址:5705156

结果字符串

地址:5705156

结果字符串

地址:5705156

地址:5705196

地址:5705156

地址:5705156

结果字符串

代码非常简单,如下所示:
#包括
#包括
使用名称空间std;
字符串测试()
{
char a[64]=“resultstring”;
返回字符串(a);
}
内部主(空)
{
//第一部分

您可能有未定义的行为。
Test()
返回的
std::string
是临时的,而
c_str()
返回的指针(存储在
j
中)在临时生命周期结束后不再有效。这意味着可能会发生任何情况。指针指向的数组可能包含垃圾,可能是原始字符串,或者实现可能以null结尾。访问它可能会导致分段错误,或者允许您访问原始字符串数据。这在不同的编译器和标准库的实现之间可以而且通常是不同的

char *j  = const_cast<char*>(Test().c_str());
// The contents pointed to by j are no longer valid and access that content 
// is undefined behavior
cout << "address:"<< (unsigned)Test().c_str() << endl;
char*j=const_cast(Test().c_str());
//j指向的内容不再有效,请访问该内容
//是未定义的行为

您可能有未定义的行为。
Test()
返回的
std::string
是临时的,而
c_str()
返回的指针(存储在
j
中)在临时生命周期结束后不再有效。这意味着可能会发生任何情况。指针指向的数组可能包含垃圾,可能是原始字符串,或者实现可能以null结尾。访问它可能会导致分段错误,或者允许您访问原始字符串数据。这在不同的编译器和标准库的实现之间可以而且通常是不同的

char *j  = const_cast<char*>(Test().c_str());
// The contents pointed to by j are no longer valid and access that content 
// is undefined behavior
cout << "address:"<< (unsigned)Test().c_str() << endl;
char*j=const_cast(Test().c_str());
//j指向的内容不再有效,请访问该内容
//是未定义的行为

cout这是完全有缺陷的。每次调用
Test()
时,您都会创建并销毁一个临时字符串。在销毁临时字符串之后,使用
Test().c_str()
返回的指针访问内存的任何尝试都没有意义-内存已经被释放。它可能具有旧值(如果在访问之前没有写入任何内容),但它也可能有任何内容(如果在访问之前重用),这是未定义的行为


在VC++中,它会被覆盖一次,在其他情况下不会被覆盖。在GCC中,它永远不会被覆盖。但这完全是偶然的。再一次,它是UB。

这是完全有缺陷的。每次调用
Test()
,都会创建并销毁一个临时字符串。任何使用
Test()返回的指针访问内存的尝试。c_str()
临时文件被销毁后没有任何意义-内存已被释放。它可能具有旧值(如果在访问之前没有写入任何内容),但也可能具有任何内容(如果在访问之前重新使用)。这是未定义的行为


对于VC++来说,它会被覆盖一次,而在其他情况下不会被覆盖。对于GCC来说,它永远不会被覆盖。但这纯粹是偶然的。再一次,它是UB。

谢谢你的回答。你是对的。而当未定义的行为发生在FUNC((char*)Test().c_str()等函数参数中时,编译器可能会进行一些优化。然后临时指针将一直处于空闲状态,直到FUNC结束。我们可以从汇编指令中知道这一点。感谢您的回答。您是对的。而编译器可能会在FUNC((char*)Test().c_str()等函数参数中发生未定义行为时进行一些优化。然后临时指针将一直处于空闲状态,直到函数结束。我们可以从汇编说明中了解这一点。