О длине строки, заканчивая NUL и т. Д.

В настоящее время я изучаю C и яЯ путаю с различиями между массивом символов и строкой, а также с тем, как они работают.

Вопрос 1:

Почему существует разница в результатах исходного кода 1 и исходного кода 2?

Исходный код 1:

#include 
#include 

int main(void)
{
    char c[2]="Hi";
    printf("%d\n", strlen(c));   //returns 3 (not 2!?)
    return 0;
}

Исходный код 2:

#include 
#include 

int main(void)
{
    char c[3]="Hi";
    printf("%d\n", strlen(c));   //returns 2 (not 3!?)
    return 0;
}

Вопрос 2:

Чем строковая переменная отличается от массива char? Как объявить их с минимально необходимыми индексными номерами, позволяющими хранить \ 0, если таковые имеются (пожалуйста, прочитайте коды ниже)?

char name[index] = "Mick";   //should index be 4 or 5?

char name[index] = {'M', 'i', 'c', 'k'};   //should index be 4 or 5?

#define name "Mick"   //what is the size? Is there a \0?

Вопрос 3:

Соответствует ли ТОЛЬКО завершающий NUL строкам, а не массивам символов? Таким образом, фактическое значение строки "Привет" is [H] [i] [\ 0] и фактическое значение массива char "Привет" такое [H] [i]?

Вопрос 4:

Предположим, c [2] собирается хранить "Привет" с последующим \ 0 (не уверен, как это сделать, используяgets(c) может быть?). Так где же хранится \ 0? Это хранитсягде-то" после того, как c [2] станет [H] [i] \ 0, или к c [2] добавится a \ 0, чтобы стать c [3], то есть [H] [i] [\ 0]?

Весьма странно, что иногда после массива string / char стоит \ 0, что вызывает проблемы, когда я сравниваю две переменныеif (c1==c2) поскольку это наиболее вероятно возвращает ЛОЖЬ (0).

Подробные ответы приветствуются. Но краткий ответ поможет моему пониманию :) Заранее спасибо!

Ответы на вопрос(3)

Ваш ответ на вопрос