Сколько байтов занимает строка #define (строковый литерал)? - PullRequest
2 голосов
/ 01 октября 2010
#define STR "test1"

Почему это занимает 6 байтов?

sizeof (STR) = 6

Ответы [ 7 ]

16 голосов
/ 01 октября 2010

В конце есть трейлинг '\0'.

5 голосов
/ 01 октября 2010

a #define просто выполняет замену текста перед компиляцией.

#define STR "test1"
sizeof(STR);

фактически рассматривается компилятором как

sizeof("test1");

теперь, почему это 6, а не 5?потому что в конце строки есть нулевой терминатор.

5 голосов
/ 01 октября 2010

Это не имеет ничего общего с #define.Массив символов будет иметь тот же размер:

const char str[] = { "test1" };
sizeof (str) == 6

Причина, по которой длина этой строки составляет 6 байтов, состоит в том, что строки в C имеют завершающий символ NUL для обозначения конца.

2 голосов
/ 01 октября 2010

Строки в C - это массивы char s, с нулевым терминатором, то есть они заканчиваются \0. Общая альтернатива - строки в стиле Pascal, где строка хранит массив char s без нулевого терминатора и где-то хранит длину строки.

1 голос
/ 01 октября 2010

Почему это занимает 6 байтов?

На самом деле, это займет (6 байт и раз; сколько раз вы его используете), потому что это макрос препроцессора.

Попробуйте const char *STR = "test1".

1 голос
/ 01 октября 2010

То, что говорили другие ... НО

В C токены предварительной обработки не занимают места. Это зависит от того, как вы их используете

#define STR "test1"

char x[] = STR;         /* 6 bytes */
char *y = STR;          /* sizeof (char*) bytes (plus possibly 6 bytes) */
int ch = STR[3];        /* 1 byte (or sizeof (int), depending on how you look at it) */
if (ch == STR[1])       /* 1 byte (or sizeof (int) or no bytes or ...) */

printf("==>" STR "<==") /* 5 bytes ??? */
0 голосов
/ 01 октября 2010

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

После программирования для некоторыхвремя, в зависимости от вашего обучения, вы можете увидеть, как значение уменьшается до 5.; -)

JK ... как сказал кто-то другой, в конце символически ничего не значило, что по иронии судьбы занимает байт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...