Я предлагаю вам попробовать эту программу:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "hello world";
char str2[20] = "goodbye world";
printf("str1: size = %zd, len = %zd\n", sizeof(str1), strlen(str1));
printf("str2: size = %zd, len = %zd\n", sizeof(str2), strlen(str2));
}
(Если у вас более старый компилятор, который не принимает %zd
, вы можете использовать "size = %d, len = %d\n", (int)sizeof(str1), (int)strlen(str1)
.)
Компилятор выдаст вам массивы, которые вы можете представить так:
+---+---+---+---+---+---+---+---+---+---+---+---+
str1: | h | e | l | l | o | | w | o | r | l | d |\0 |
+---+---+---+---+---+---+---+---+---+---+---+---+
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
str2: | g | o | o | d | b | y | e | | w | o | r | l | d |\0 | | | | | | |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
(На самом деле, хотя я явно не показал их все, гарантировано, что все «пустые» ячейки к концуиз str2
также будет содержать \0
.)
В общем случае, если вы попытаетесь получить доступ к памяти из определенного конца массива: (a) вы не найдете ничего интересного, и(б) это запрещено, хотя (в) компилятор C, как правило, не мешает вам попробовать.
Если вы действительно хотите увидеть, что происходит, попробуйте запустить этот цикл:
for(int i = 0; i < 30; i++)
printf("str1[%d] = '%c'\n", i, str1[i]);
Вы, вероятно, увидите строку «прощальный мир», скрывающуюся в памяти «с конца» str1
.Если вы этого не сделаете, попробуйте поменять местами порядок str1
и str2
:
char str2[20] = "goodbye world";
char str1[] = "hello world";
Но, конечно, вы здесь "нарушаете правила", и также возможно, что вы не будетепосмотрите дополнительную строку "до свидания" в любом случае, или что ваша программа потерпит крах при попытке.
Еще одна вещь.Я хочу вернуться к тому, что вы сказали в комментарии.Вы сказали:
Я пытаюсь выяснить и понять, что может быть за нулевым терминатором после 'd' в мире приветствия.Я ожидал, что str[]
заполнит все остальные нулевыми терминаторами, как и в случае с str[20]
.
Теперь, на самом деле, str[20]
имеет «остальные, заполненные нулевыми терминаторами»потому что и только , потому что вы явно выделяете массив с большим количеством символов, чем нужно.Когда вы говорите str[] = "..."
, с другой стороны, вы получаете массив с точно символами, которые ему нужны (включая один , оканчивающийся \0
).Когда вы объявляете str[] = "..."
, даже не имеет смысла говорить «остальное заполнено ...», потому что нет «отдыха» для заполнения.