C++ c++;:char*始终存储单词向量
这虽然是一个特定于代码的问题,但其输出非常奇怪 我知道STL字符串等。当我发现一些奇怪的东西时,我正在鬼混,但找不到原因( 请参阅下面的两个代码和输出 [代码#1]() 这是跨GCC/MinGW x64的。这一个从不打印垃圾值,但始终包含单词“vector”C++ c++;:char*始终存储单词向量,c++,pointers,gcc,mingw,mingw-w64,C++,Pointers,Gcc,Mingw,Mingw W64,这虽然是一个特定于代码的问题,但其输出非常奇怪 我知道STL字符串等。当我发现一些奇怪的东西时,我正在鬼混,但找不到原因( 请参阅下面的两个代码和输出 [代码#1]() 这是跨GCC/MinGW x64的。这一个从不打印垃圾值,但始终包含单词“vector” 函数中的char*指向哪里 为什么“向量”会存在呢 此外,char*的大小是8 编辑:如果不是围绕“类”进行包装,则不会发生这种情况 “vector”这个词总是出现。我想它是随机垃圾值,但为什么ideone的内存中仍然有相同的词?代码中
- 函数中的char*指向哪里
- 为什么“向量”会存在呢
- 此外,char*的大小是8
“vector”这个词总是出现。我想它是随机垃圾值,但为什么ideone的内存中仍然有相同的词?代码中的主要问题是
int sz=sizeof(S);
sizeof(S)
总是等于sizeof(char*)
在您的系统上似乎是8
。sizeof
提供变量本身的字节数。如果您想知道字符串中char
指针指向的字节数,应该使用strlen
函数
当您访问不在分配空间中的内存时,您会在输出中随机获得该
向量字符串。访问此类内存是未定义的行为,因此您会得到未定义的结果。您认为int sz=sizeof(S);
正在做什么?提示:它不会给出字符串的长度。sizeof(S)
告诉您指针S
占用多少内存。它与字符串中的字符数无关。请使用strlen
相反。relaterd/dupe:它是char*。我没有使用stringA char*通常是指向以null结尾的字符串中的第一个字符的指针,就像在本例中一样。向量字似乎不是那么随机。它总是存在。如果它是随机的,那么有时它也会打印垃圾值。@Recoder这就是未定义行为的本质:sometim是的,它可以做你期望的事情,即使这不是逻辑上或一致的。但这不是你可以依赖的行为,也不应该在一个健全的环境中实现。@Xirema那么为什么在第一个版本中,当a未被触及时,它会打印垃圾值。我在这两种情况下都期望垃圾值。@recorder它会发生,这样字符串“vector”
存储在程序内存中,就在“G”
字符串文字之后。在“G”之后的程序二进制文件中可能有这样的字符串
。如果您向程序中添加了一些内容,或者使用不同的配置或设置构建它,可能是不同的字符串,或者您的程序甚至可能崩溃。也可能是,您只会将G
作为输出。这就是为什么这种行为未定义的原因。@Recoder--对“为什么它做X”最直接的回答是“因为它做X”。不要在未定义的行为中寻找一致性或逻辑。它只是不可预测的。除非它不是。
#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstdio>
using namespace std;
class str
{
private:
vector<char> A;
public:
str(const char *S) {
int sz = sizeof(S);
cerr << sz << endl;
for (int i = 0; i < sz; ++i) {
cout << S[i];
//A.push_back(S[i]); //!-- Comment --!//
}
}
};
int main(int argc, char const *argv[])
{
str A("");
return 0;
}
#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstdio>
using namespace std;
class str
{
private:
vector<char> A;
public:
str(const char *S) {
int sz = sizeof(S);
cerr << sz << endl;
for (int i = 0; i < sz; ++i) {
cout << S[i];
A.push_back(S[i]);
}
}
};
int main(int argc, char const *argv[])
{
str A("G");
return 0;
}
Gvector