2010-09-02 2 views
1
#include <cstdlib> 
#include <iostream> 

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

    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

Выход:C++ SizeOf (...)

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

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

+2

Где «строка» из? Запуск кода примера с помощью компилятора приведет к ошибке компиляции, поскольку некоторые из них будут неопределенными. (Я не могу себе представить, какой размер какой-либо, но наиболее наивный из «строковых» реализаций составляет всего 4.) –

+0

@ dash-tom-bang только что отредактирован, чтобы включить мои файлы заголовков –

+0

sizeof вычисляет размер типа данных, что полезно, если вы выполняете динамическое распределение. Я считаю, что string.length или размер - это то, что вы хотите. – 2010-09-02 17:02:53

ответ

19

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

#include <string> 
using namespace std; 

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

string s; 
cout << s.size(); 
2

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

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

Try, чтобы увидеть это так:

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

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

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

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

size_type size() const 

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

+0

Что означает «sizeof class String is 4»? –

+0

Это размер переменных-членов, необходимых для функции строковых классов. – GWW

+0

Это размер 'указателя' строки' class'. Который в этом случае кажется 32-битным целым числом. –

2

Совсем нет. Это означает, что структура класса такова, что он не включает в себя динамическую память, которую он может контролировать. 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, скорее всего, указателя некоторого вида к более крупной структуре. Хотя некоторые оптимизации на некоторых платформах будут использовать его в качестве фактических данных строки до тех пор, пока он не станет больше, чем может поместиться.

0

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

+0

С реализацией GCC std :: string состоит из одного указателя на общую структуру, которая сохраняет размер, емкость и буфер вместе в одном и том же блоке непрерывной памяти. Вероятно, не редкость и в некоторых других реализациях. – UncleBens

+0

Microsoft использует этот подход для своего класса 'CString', но удивительно не для их версии' std :: string'. – dan04

12

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

char *string; 

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

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

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

char string[10]; 

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

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

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

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

string s = "12345"; 
cout << "length of String " << s.length(); 
3

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

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

Я думаю, ваша проблема ваша концепция sizeof, увидеть больше информации here и here некоторое объяснение того, как это работает.

6

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. Это справедливо только в том случае, когда char имеет 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) всегда остается таким же, как указатель размера по данной архитектуре, который на вашей системе равен 4.

0

вы также можете использовать и может узнать его длину с помощью функции 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/