sizeof继续返回4而不是实际大小

Gue*_*est 4 c++ sizeof

#include <iostream>

using namespace std;

int main()
{
    cout << "Do you need to encrypt or decrypt?" << endl;
    string message;
    getline(cin, message);

    int letter2number;

    for (int place = 1; place < sizeof(message); place++)
    {
        letter2number = static_cast<int>(message[place]);
        cout << letter2number << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题的例子:我输入十五个字母,但只打印四个整数.我输入了七个字母,但只打印了四个整数.

循环仅在我的计算机上出现四次,而不是字符串中的字符数.

这是我遇到的唯一问题,所以如果你看到其他错误,请不要告诉我.(这样更有趣.)

感谢您的时间.

GMa*_*ckG 11

sizeof返回表达式的大小.对你来说,这是一个std::string和你的实施std::string,那是四个.(可能是内部指向缓冲区的指针.)

但是你看,缓冲区只是由字符串指向,它对std::string自身的大小没有影响.你想要message.size()的,它给你的缓冲区指针所指向的字符串的大小.

string内容发生变化时,缓冲区指针指向哪些变化,但指针本身的大小始终相同.


考虑以下:

struct foo
{
    int bar;
};
Run Code Online (Sandbox Code Playgroud)

此时,sizeof(foo)已知; 它是一个编译时常量.它的大小int与编译器可能添加的任何其他填充一起.

您可以bar接受任何您想要的值,并且大小保持不变,因为它bar的价值与其bar自身的类型和大小无关.


Bri*_*ndy 5

你想用message.size()没有sizeof(message).

sizeof只给出数据类型或表达式中的字节数.您想要通过调用给出的字符串中存储的字符数size()

索引也从0开始,注意我从1变为0.

for (int place = 0; place < message.size(); place++)
{
    letter2number = static_cast<int>(message[place]);
    cout << letter2number << endl;
}
Run Code Online (Sandbox Code Playgroud)

x86系统上的任何指针只有4个字节.即使它指向堆上包含100个元素的数组的第一个元素.

例:

char * p = new char[5000];
assert(sizeof(p) == 4);
Run Code Online (Sandbox Code Playgroud)

假设没有填充,p在a中包装classstruct将给出相同的结果.