c ++:char *始终存储单词vector

时间:2018-07-10 14:13:26

标签: c++ pointers gcc mingw mingw-w64

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

我知道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”。

  • 函数中的char *指向哪里?
  • 为什么“矢量”仍然存在?
  • 此外,char *的大小为8。

编辑:如果未将其包装在“类”中,则不会发生这种情况。

单词“ vector”总是出现。我以为这是随机垃圾值,但是ideone为何在其内存中仍然有相同的单词?

1 个答案:

答案 0 :(得分:1)

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

当您访问不在分配空间中的内存时,会在输出中随机获得vector字符串。访问此类内存是未定义的行为,因此您会得到未定义的结果。