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

问题描述 投票:4回答:5
#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;
    }
}

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

循环只会在我的计算机上发生四次,而不是字符串中的字符数。

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

谢谢您的时间。

c++ sizeof
5个回答
11
投票

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

但是您会看到,该缓冲区仅由字符串指向,它对std::string本身的大小没有影响。为此,您需要message.size(),它为您提供了该缓冲区指针所指向的字符串的大小。

[string的内容更改时,缓冲区指针指向的内容更改,但是指针本身始终是相同大小。


请考虑以下内容:

struct foo
{
    int bar;
};

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

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


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
投票
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...

1
投票

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


-2
投票
#include<iostream>
#include<conio.h>
using namespace 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;
}    
© www.soinside.com 2019 - 2024. All rights reserved.