c++ : char* 总是存储词向量

c++ : char* invariably stores the word vector

虽然这是一个特定于代码的问题,但输出非常奇怪。

我知道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;
}

在此,传递并打印了一个空字符串。 Vector 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'.

编辑:如果它没有包裹在 'class' 周围,则不会发生这种情况。

单词'vector'总是出现。我以为它是随机垃圾值,但为什么 ideone 的内存中仍然有相同的词?

您代码中的主要问题在第 int sz = sizeof(S); 行。 sizeof(S) 总是等于 sizeof(char *) 在您的系统上似乎是 8sizeof 为您提供变量本身的字节数。如果您想知道 char 指针指向的字符串中的字节数,您应该改用 strlen 函数。

你在输出中随机得到 vector 字符串,因为你正在访问未分配的内存 space。访问此类内存是未定义的行为,因此您会得到未定义的结果。