#c
#c
Вопрос:
Я пытаюсь понять неуправляемый код. Я родом из C #, и я немного играю с C .
Почему это этот код:
#include <iostream>
using namespace std;
int main()
{
char s[] = "sizeme";
cout << sizeof(s);
int i = 0;
while(i<sizeof(s))
{
cout<<"nindex "<<i<<":"<<s[i];
i ;
}
return 0;
}
выводит это:
7
index 0:s
index 1:i
index 2:z
index 3:e
index 4:m
index 5:e
index 6:
????
Разве sizeof() не должен возвращать 6?
Комментарии:
1. 1 за исключительно хорошо написанный и отформатированный вопрос, даже если он простой, и вы, возможно, смогли найти ответ при поиске. Если бы все, кто публиковал вопросы для новичков, делали это так хорошо, не было бы неприятно постоянно видеть дубликаты.
Ответ №1:
Строки C имеют «нулевое завершение», что означает, что в конце есть дополнительный байт со значением 0x00
. При вызове вы sizeof(s)
получаете размер всего буфера, включая нулевой терминатор. При вызове вы strlen(s)
получаете длину строки, содержащейся в буфере, не включая nul .
Обратите внимание, что если вы измените содержимое s
и поместите нулевой терминатор где-нибудь, кроме конца, то sizeof(s)
все равно будет 7 (потому что это статическое свойство способа s
объявления), но strlen(s)
может быть несколько меньше (потому что это вычисляется во время выполнения).
Ответ №2:
Нет, все trings в C завершаются нулевым символом (ascii 0). На s
самом деле это 7 байт
s i z e m e 0
Ответ №3:
Это связано с тем, что C-строки содержат значение 0
(или ''
) в качестве последнего символа для обозначения конца строки.
Ответ №4:
s — это семь байтов, 6 для строки и один для нулевого завершения.