У меня вопрос о размере данных в const void *. В приведенном ниже коде вывод первого printf равен 6, а вывод второго printf равен 3. Пожалуйста, помогите, я не могу найти, откуда эта проблема. заранее спасибо
#define TEST "\x00\x01\x02\x03\x04\x05"
#include <stdio.h>
static void function(const void* c);
int main (void) {
printf("TEST: %d\n",sizeof(TEST) -1);
function(TEST);
return 0;
}
static void function(const void* c) {
printf("TEST: %d\n",sizeof(c) -1);
}
В первом случае sizeof(TEST)
- это размер строкового литерала, который представляет собой массив, достаточно большой, чтобы содержать все символы плюс терминатор - в этом случае - 7 байт.
Во втором случае sizeof(c)
- это размер указателя - 4 байта на вашей 32-битной платформе.
В общем, невозможно указать размер массива, заданный только указателем на него. Если он указал на строку с завершенным стилем, вы можете измерить длину с помощью strlen(c)
. Однако в этом случае он содержит нулевой символ, поэтому нет способа определить длину.
В C++ вы можете использовать шаблон, а не sizeof
, чтобы получить размер массива:
template<typename T, size_t N> size_t array_size(T(&)[N]) {return N;}
Это имеет то преимущество, что вы получите ошибку времени компиляции, а не неожиданный результат выполнения, если вы случайно примените ее к указателю вместо массива.
Оператор sizeof
возвращает количество байтов либо имени типа, либо выражения в отношении sizeof(char)
. Имеет следующий синтаксис:
sizeof unary-expression
sizeof ( type-name )
Если это унарное выражение и это строковый литерал, подобный sizeof(TEST)
он возвращает количество байтов в этой строке, включая null-byte-terminattor. Но если это выражение типа 2*p
которое имеет тип, возвращающий int
, выражение оценивается во время компиляции (без какого-либо побочного эффекта) и возвращается возвращаемый тип (int
), поскольку sizeof(int)
Или, если это type-name
типа, как в вашем sizeof(c)
оно возвращает независимое от платформы количество байтов этого типа. например, sizeof(int)
на 32-битной машине - 4
байта.
sizeof
возвращает размер в количестве char
s
sizeof
всегда измеряется в байтах. char
- это один байт.