Оператор
sizeof
статически оценивает размер объекта, который вы ему передаете. char*
- указатель, который в зависимости от архитектуры машины имеет определенный размер (4 байта в 32-битных системах и 8 байтов на 64-битных машинах). Чтобы выполнить то, что вы пытаетесь сделать, я предлагаю вам использовать тип string
, который вы можете использовать, добавив #include <string>
вместе с using namespace std;
в ваш исходный файл.
string line;
cin >> line;
cout << line.length() << endl;
Это менее подвержено ошибкам и проще в использовании.
Кстати, то, что вы пытались сделать, действительно опасно. Фактически, когда вы используете cin >> myArray
, вы уже должны были выделить часть памяти для myArray
, чего вы еще не сделали. Это приведет к повреждению памяти, что может привести к сбою в работе вашей программы и, возможно, подвергнуть ее атакам переполнения.
Простой массив в C ++ не имеет представления о его размере. Вы можете использовать sizeof
только в том случае, если массив статически размещен , и вы используете sizeof
для самого массива, а не другой указатель на него, например, это не будет работать, как вы могли ожидать:
int x[5];
int *a = &x[0];
// a[i] is now the same as x[i] but:
cout << sizeof(x) << endl; // prints 20, assuming int is 32 bits long
cout << sizeof(a) << endl; // prints 4, assuming a pointer is 32 bits long
Обратите внимание, что общий размер массива напечатан в первой строке, а не количество элементов. Вы можете использовать sizeof(x)/sizeof(*x)
, чтобы узнать количество элементов в статических массивах. Это невозможно для динамически размещаемых массивов, использующих new
. На самом деле массивы C ++ очень подвержены ошибкам, и вы должны быть предельно осторожны при работе с ними, и вместо них лучше использовать vector
и string
.