【问题标题】:c++ : char* invariably stores the word vectorc++ : char* 总是存储词向量
【发布时间】:2018-07-10 14:13:26
【问题描述】:

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

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

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

“向量”这个词总是出现。我以为它是随机垃圾值,但为什么 ideone 的记忆中仍然有相同的词?

【问题讨论】:

  • 你认为int sz = sizeof(S); 在做什么?提示:它没有给你字符串的长度。
  • sizeof(S) 告诉您指针S 占用了多少内存。它与字符串中的字符数无关。请改用strlen(S)
  • 是字符 *。我没有使用字符串
  • 字符 * 通常是指向以空字符结尾的字符串中的第一个字符的指针,在这种情况下就是如此。

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


【解决方案1】:

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

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

【讨论】:

  • 向量词似乎没有那么随意。它总是在那里。如果它是随机的,那么有时它也会打印垃圾值。
  • @Recoder 这就是 Undefined Behavior 的本质:有时,它可以做你期望的事情,即使那不是合乎逻辑或一致的。但这不是您可以依赖或应该在健全的环境中实施的行为。
  • @Xirema 那么为什么在未触及 A 的第一个版本中会打印垃圾值。在这两种情况下,我都期待垃圾价值。
  • @Recoder 恰好在"G" 字符串文字之后字符串"vector" 存储在程序内存中。在"G" 之后,您的程序二进制文件中可能有这样的字符串。如果你在你的程序中添加一些东西,或者用不同的配置或设置构建它,那可能是一个不同的字符串,或者你的程序甚至可能崩溃。也许你只会得到G 作为输出。这就是为什么这种行为是不确定的。
  • @Recoder -- 对“它为什么做 X”最直接的回答就是“因为它做 X”。不要在未定义的行为中寻找一致性或逻辑。这简直是​​不可预测的。除非不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 2015-04-18
相关资源
最近更新 更多