c ++ sizeof (...) - PullRequest
       18

c ++ sizeof (...)

3 голосов
/ 02 сентября 2010
#include <cstdlib>
#include <iostream>

int main(int argc, char *argv[])
{
   cout << "size of String " << sizeof(string );

   system("PAUSE");
   return EXIT_SUCCESS;
}

Выход:

размер строки = 4

Означает ли это, что, поскольку sizeof(char) = 1 Byte (0 to 255), строка может содержать только 4 символов?

Ответы [ 9 ]

26 голосов
/ 02 сентября 2010

Из вашего примера не ясно, что такое «строка».Если у вас есть:

#include <string>
using namespace std;

, то string равно std::string, а sizeof(std::string) дает вам размер экземпляра класса и его членов данных, а не длину строки.Чтобы получить это, используйте:

string s;
cout << s.size();
13 голосов
/ 02 сентября 2010

Когда string определяется как:

char *string;

sizeof(string) сообщает размер указателя.4 байта (вы на 32-битной машине). Вы еще не распределили память для хранения текста.Вы хотите строку из 10 символов?строка = malloc (10);Теперь строка указывает на 10-байтовый буфер, в который вы можете поместить символы.

sizeof(*string) будет 1. Размер строки, на которую указывает строка, - символ.

Если вы сделали это

char string[10];

sizeof(string) будет 10. Это массив из 10 символов.sizeof(*string) было бы еще 1.

Стоило бы посмотреть и понять макрос __countof.

Обновление: о да, СЕЙЧАС включайте заголовки :) "строка" - этокласс, чьи экземпляры занимают 4 байта, это все, что значит.Эти 4 байта могут указывать на что-то гораздо более полезное, например на область памяти, содержащую более 4 символов.

Вы можете делать такие вещи, как:

string s = "12345";
cout << "length of String " << s.length();
6 голосов
/ 03 сентября 2010

sizeof(char) всегда 1 байт.A byte, который мы считаем 8-bits need not be the case.Существуют архитектуры, в которых значение BYTE составляет 32 бита, 24 бита и т. Д.sizeof, примененный к любому другому типу, кратен sizeof(char), равному by definition 1.

. Следующее, что важно отметить, состоит в том, что C ++ имеет три типа символов: plain char, signed char and unsigned char.A plain char является либо signed, либо unsigned.Поэтому неверно полагать, что char может иметь только значения от 0 до 255. Это верно только в том случае, если символ 8-битный, а plain char равен unsigned.

Сказав, что если предположить, что 'строка' равна 'std::namespace', sizeof(string) == 4 означает, что размер класса 'std::string' равен 4 байта.Он занимает в 4 раза больше байтов, чем занимает 'char' на этой машине.Note that signed T, unsigned T always have the same size.Это не означает, что фактический буфер символов (который обычно называется строкой) составляет всего 4 байта.Внутри класса 'std::string' имеется нестатический указатель на член, который динамически выделяется для хранения входного буфера.В нем может быть столько элементов, сколько позволяет система (C ++ не ограничивает эту длину).Но поскольку класс 'std::string' содержит только указатель на этот потенциально бесконечный буфер длины, sizeof (std :: string) всегда остается таким же, как sizeof указателя в данной архитектуре, которая в вашей системе равна 4.

4 голосов
/ 02 сентября 2010

Я знаю, что многие люди ответили на ваш вопрос, но вот некоторые моменты:

  1. Это не размер string или емкость строки, это значение представляет структурнуюразмер класса string, который вы можете видеть по его реализации (и он может меняться от реализации к реализации), который является простым указателем;
  2. Поскольку sizeof(string) - это размер структуры класса,вы получите размер единственного внутреннего указателя, который в вашем случае составляет 4 байта (поскольку вы находитесь на 32-разрядной машине, это также может изменяться от платформы к платформе);
  3. Этот указатель внутриstring class, указывает на буфер памяти, где класс будет содержать реальные строковые данные, этот буфер памяти перераспределяется по мере необходимости, он может увеличиваться / уменьшаться по мере добавления / удаления / создания дополнительного строкового текста;
  4. Если вы хотите получить реальный размер строки, вам нужно вызвать метод size() из класса, который проверит размер строки буфера памяти (который не совпадает сразмер буфера памяти).

Я думаю, что ваша проблема заключается в вашей концепции sizeof, см. дополнительную информацию здесь и здесь - некоторые пояснения оэто работает.

2 голосов
/ 02 сентября 2010

Совсем нет. Это означает, что структура класса такова, что она не включает динамическую память, которой он может управлять. std :: string будет динамически расширяться для соответствия любому необходимому размеру.

s.max_size() // will give the true maximum size
s.capacity() // will tell you how much it can hold before resizing again
s.size() // tells you how much it currently holds

Число 4, полученное из sizeof, скорее всего, является указателем на более крупную структуру. Хотя некоторые оптимизации на некоторых платформах будут использовать их в качестве фактических строковых данных, пока они не станут больше, чем могут уместиться.

2 голосов
/ 02 сентября 2010

Нет, это означает, что размер строки класса равен 4.

Это не означает, что строка может содержаться в 4 байтах памяти. Не за что. Но вы должны различать динамическую память, которая содержит символы size, из которых может состоять строка, и память, занятую адресом первого из этих символов

Попробуйте увидеть это так:

contents  --------> |h|e|l|l|o| |w|o|r|ld|\0|

sizeof 4 относится к памяти, занимаемой содержимым. Каково это содержание? Просто указатель на (адрес) первого символа в массиве символов.

Сколько символов может содержать строка? В идеале, символ на байт доступен в памяти.

Сколько символов на самом деле имеет строка? Ну, есть функция-член под названием size(), которая скажет вам, что

size_type size() const

Подробнее на странице SGI !

0 голосов
/ 17 марта 2019

Это хорошо сработало для меня

string StringToLower(string str)
{
    string loweredStr = "";

    for (int i = 0; i < str.length(); i++)
    {
        if (str[i] >= 'A' && str[i] <= 'Z')
            loweredStr += (char)(str[i] + 32);
        else
            loweredStr += str[i];
    }

    return loweredStr;
}
0 голосов
/ 28 сентября 2013

вы также можете использовать строки и узнать их длину с помощью функции string.length (). посмотрите на код ниже:

// Finding length of a string in C++

#include<iostream>
#include<string>
using namespace std;

int count(string);

int main()
{
string str;
cout << "Enter a string: ";
getline(cin,str);
cout << "\nString: " << str << endl;
cout << count(str) << endl;

return 0;

}

int count(string s){
if(s == "")
  return 0;
if(s.length() == 1)
  return 1;
else
    return (s.length());

}

подробности можно получить у: http://www.programmingtunes.com/finding-length-of-a-string-in-c/

0 голосов
/ 02 сентября 2010

A string объект содержит указатель на буфер в куче, который содержит фактические строковые данные.(Он также может содержать другую специфическую для реализации метаинформацию, но ваша, очевидно, нет.) Таким образом, вы получаете размер этого указателя, а не размер массива, на который он указывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...