Размер символа и постоянная пустота * [копия]

0

У меня вопрос о размере данных в 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);
}
Теги:

2 ответа

5
Лучший ответ

В первом случае 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;}

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

  • 0
    Я пытаюсь с помощью strlen (c), но получаю 0 за размер. Можете ли вы дать более подробную информацию, пожалуйста. Спасибо!
  • 0
    @ user3821117: Ваша строка начинается с нулевого символа, поэтому она будет иметь нулевую длину. Так как это недопустимая строка в стиле C, нет способа найти длину.
1

Оператор 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 байта.

  • 0
    sizeof возвращает размер в количестве char s
  • 0
    @clcto, sizeof всегда измеряется в байтах. char - это один байт.
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню