Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;:char*始终存储单词向量_C++_Pointers_Gcc_Mingw_Mingw W64 - Fatal编程技术网

C++ c++;:char*始终存储单词向量

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的内存中仍然有相同的词?代码中

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

我知道STL字符串等。当我发现一些奇怪的东西时,我正在鬼混,但找不到原因(

请参阅下面的两个代码和输出

[代码#1]()

这是跨GCC/MinGW x64的。这一个从不打印垃圾值,但始终包含单词“vector”

  • 函数中的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