Могу ли я получить некоторую помощь с этой строкой в стиле C в C ?

#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 для строки и один для нулевого завершения.