Могу ли я получить некоторую помощь с этой строкой стиля 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
Строки C "nul-terminated", что означает, что в конце есть дополнительный байт со значением 0x00
. Когда вы вызываете sizeof(s)
, вы получаете размер всего буфера, включая терминатор nul. Когда вы вызываете strlen(s)
, вы получаете длину строки, содержащейся в буфере, не включая nul.
Обратите внимание, что если вы измените содержимое s
и поместите nul-терминатор где-нибудь, кроме конца, тогда sizeof(s)
будет по-прежнему равно 7 (поскольку это статическое свойство того, как s
объявлено), но strlen(s)
может быть несколько меньше (потому что это вычисляется во время выполнения).
Ответ 2
Нет, все тэги в C заканчиваются нулевым символом (ascii 0). Итак, s
на самом деле 7 байт
s i z e m e \0
Ответ 3
Это связано с тем, что C-строки содержат значение 0
(или '\0'
) в качестве последнего символа, чтобы пометить конец строки.
Ответ 4
s - семь байтов, 6 - для строки, а для нулевого завершения -