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'.
- 函数中的char*指向哪里?
- 为什么 'vector' 无论如何都会在那里?
- 此外,char * 的大小为 8。
编辑:如果它没有包裹在 'class' 周围,则不会发生这种情况。
单词'vector'总是出现。我以为它是随机垃圾值,但为什么 ideone 的内存中仍然有相同的词?
您代码中的主要问题在第 int sz = sizeof(S);
行。 sizeof(S)
总是等于 sizeof(char *)
在您的系统上似乎是 8
。 sizeof
为您提供变量本身的字节数。如果您想知道 char
指针指向的字符串中的字节数,您应该改用 strlen
函数。
你在输出中随机得到 vector
字符串,因为你正在访问未分配的内存 space。访问此类内存是未定义的行为,因此您会得到未定义的结果。
虽然这是一个特定于代码的问题,但输出非常奇怪。
我知道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'.
- 函数中的char*指向哪里?
- 为什么 'vector' 无论如何都会在那里?
- 此外,char * 的大小为 8。
编辑:如果它没有包裹在 'class' 周围,则不会发生这种情况。
单词'vector'总是出现。我以为它是随机垃圾值,但为什么 ideone 的内存中仍然有相同的词?
您代码中的主要问题在第 int sz = sizeof(S);
行。 sizeof(S)
总是等于 sizeof(char *)
在您的系统上似乎是 8
。 sizeof
为您提供变量本身的字节数。如果您想知道 char
指针指向的字符串中的字节数,您应该改用 strlen
函数。
你在输出中随机得到 vector
字符串,因为你正在访问未分配的内存 space。访问此类内存是未定义的行为,因此您会得到未定义的结果。