#include <string>
#include <cstdio>
int main() {
std::string s = "12345678";
std::printf("[%s]\n", s);
}
这是一个明显错误的“.c_str()”。但VS2011即使使用/ Wall也不会发出任何警告,并且该程序可以运行。如果要在gcc中编译此代码,它会显示“警告:无法传递非POD类型的对象'struct std :: string'到'...';调用将在运行时中止”并且程序崩溃时出现“非法指令”
他们是否真的在VS STL中实现了一个技巧,让这个打字错误的程序只是因为这个错字很常见?
更新:问题是它在VS中的作用?
答案 0 :(得分:9)
原因似乎是在Visual Studio的std::string
实现中,第一个成员是char*
。传递string
by value会将此指针(以及其他数据成员)复制到堆栈上,而%s
会导致printf()
读取char*
- 并将其解释正确的,因为string
需要以空值终止。
这当然是依赖于未定义的行为,你不应该这样做。
答案 1 :(得分:7)
这是有效的,因为未定义行为的一个可能结果是程序执行您想要的操作。你不需要再看这个了。未定义的行为是您可以避免的,而不是试图在一个特定的编译器中理解它的表现形式。