Массив объявлен как
char *str[]={"Frogs","do","not","die","they","croak"};
имеет тип char *[6]
. то есть он представляет собой 6 указателей на персонажей. Следовательно, str[0]
имеет тип char *
, то есть это указатель.
Таким образом
sizeof(str[0])
эквивалентно
sizeof(char *)
и в вашей системе, равно 8.
В свою очередь
sizeof (str)
эквивалентно
6 * sizeof(char *)
и равным 48.
Примите во внимание, что в этом списке инициализатора
char *str[]={"Frogs","do","not","die","they","croak"};
строковые литералы неявно преобразуются в указатели на их первые символы.
С другой стороны, если вы будете писать, например
sizeof("Frogs")
то выражение будет равно 6 becuase 1) строковых литералов являются символьные массивы, которые включают в себя согласующие нулю и 2) в пределах оператора SizeOf они неявно преобразованные в указатели на их первые символы, они считаются массивами.
Вы можете определить двумерный массив строк следующим образом
char str[][6] = { "Frogs", "do", "not", "die", "they", "croak" };
В этом случае
sizeof(str[0])
будет равно 6 и
sizeof(str)
будет равна 36, потому что в этом случае str
представляет собой массив элементов типа char [6]
Обратите внимание на то, что в последнем случае вы можете изменить элементы массива следующим образом
str[0][0] = 'f';
времени, когда у вас есть массив указателей на строковые литералы (как в исходном посте) вы можете не писать
str[0][0] = 'f';
потому что строковые литералы неизменяемы.
И еще один об операторе sizeof
. В соответствии со стандартом C (6.5.3.4 SizeOf и alignof операторов)
2 Оператор SizeOf дает размер (в байтах ) своего операнда, который может быть выражение в скобках или имя тип. Размер определяется по типу операнда. Результатом является целое число . Если тип операнда - это тип массива переменной длины, то оценивается операнд; в противном случае операнд не оценивается и результат представляет собой целочисленную константу.
Таким образом, при применении к массиву оператор выводит количество байтов, которое занимает массив. Он не дает количество элементов в массиве. Если вы хотите, чтобы получить количество элементов в массиве следует использовать выражение:
sizeof(array)/sizeof(array[0])
или
sizeof(array)/sizeof(*array)
Да, я использую 64-битную систему –
Как вы на 64-битных, вы не должны печатать 'size_t' введите «значения», используя спецификатор преобразования «d», поскольку это ожидает 'int', который, вероятно, имеет ширину 32 бит, в отличие от' size_t', который, как ожидается, будет иметь ширину 64 бит. – alk
Почему вы ожидаете, что 'sizeof (T)' совпадает с 'sizeof (T *)'? Они разные, почему их размер должен быть равным? –