这虽然是一个特定于代码的问题,但是输出却很奇怪。
我知道STL字符串等。当我发现一些奇怪的东西并且找不到原因时,我正在鬼混。 :(
请参见下面的两个代码和输出。
[代码#1 ](https://ideone.com/ydB8sQ)
#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;
}
在此,将传递并打印一个空字符串。向量A不执行任何操作,但与此问题相关。在第一个版本中,A保持不变,并且代码显示垃圾值。 (请参阅ideone O / P)
在第二个版本中(请参阅A.push_back取消注释)
[代码#2 ](https://ideone.com/PPHGZy)
#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
这适用于GCC / MinGW x64。这个从不打印垃圾值,但始终包含单词“ vector”。
编辑:如果未将其包装在“类”中,则不会发生这种情况。
单词“ vector”总是出现。我以为这是随机垃圾值,但是ideone为何在其内存中仍然有相同的单词?
答案 0 :(得分:1)
您的代码中的主要问题在第int sz = sizeof(S);
行中。 sizeof(S)
始终等于sizeof(char *)
,在您的系统上似乎是8
。 sizeof
给出变量本身的字节数。如果您想知道char
指针指向的字符串中的字节数,则应改用strlen
函数。
当您访问不在分配空间中的内存时,会在输出中随机获得vector
字符串。访问此类内存是未定义的行为,因此您会得到未定义的结果。