Могу ли я получить некоторую помощь с этой строкой стиля 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 - для строки, а для нулевого завершения -