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

时间:2010-04-03 05:22:22

标签: 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;
    }
}

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

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

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

感谢您的时间。

5 个答案:

答案 0 :(得分:11)

sizeof返回表达式的大小。对于您而言,这是std::string,对于std::string的实施,这是四个。 (可能是内部指向缓冲区的指针。)

但是你知道,该缓冲区仅由字符串指向,它对std::string本身的大小没有影响。你想要message.size(),它给你那个缓冲区指针所指向的字符串的大小。

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


请考虑以下事项:

struct foo
{
    int bar;
};

此时,sizeof(foo)已知;它是一个编译时常量。它是int的大小以及编译器可能添加的任何其他padding

您可以让bar接受您想要的任何值,并且大小保持不变,因为bar的值与bar的类型和大小无关本身。

答案 1 :(得分: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;
}

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

示例:

char * p = new char[5000];
assert(sizeof(p) == 4);

假设没有填充,在pclass中包裹struct会给您相同的结果。

答案 2 :(得分:2)

class string
{
    char * ptr;
    //...
    size_t size();  // return number of chars (until null) in buffer pointed to by ptr
};

sizeof(message) == sizeof(string) == sizeof(ptr) == 4; // size of the struct

message.size() == number of characters in the message...

答案 3 :(得分:1)

sizeof(type)返回类型的大小,而不是对象。使用length()方法查找字符串的长度。

答案 4 :(得分:-2)

包括

包括

使用命名空间std; int main() {

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

int letter2number;

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


getch();
return 0;

}