Есть два массива:
char a[] = "Nice you!";
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
Я думаю, что a[] и b[] абсолютно одинаковы. Итак, вот мой код, чтобы увидеть, что находится после последнего элемента каждого массива:
#include <stdio.h>
int main(void)
{
char a[] = "Nice you!";
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
char *pa;
char *pb;
pa = a;
pb = b;
printf("*(pa + 9)= %d\n", *(pa + 9));
printf("*(pb + 9)= %d\n", *(pb + 9));
return 0;
}
Я правильно понимаю? Я не так уверен и нуждаюсь в подтверждении.





Это почти то же самое.
Этот массив завершается NUL:
char a[] = "Nice you!";
Этот массив не завершен NUL:
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
Точный эквивалент массива a таков:
char c[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', 0};
^ NUL terminator
В вашем коде *(pb + 9) обращается к одному элементу за пределами массива, поэтому поведение вашей программы не определено.
I think a[] and b[] are exactly the same....
Нет, они не такие. Разница в нулевом символе завершения.
Этот
char a[] = "Nice you!";
эквивалентно этому
char a[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!', '\0'};
^^^
Последним элементом массива a является символ завершающего нулем - '\0'.
В этом
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
последний элемент массива b - это символ '!'.
Массив a - это нить1), а массив b - это массив символов.
Когда мы опускаем размер, компилятор вычисляет его за нас на основе размера инициализатора. Таким образом, размерность массива a будет 10, тогда как размерность массива b будет 9.
В вашей программе вы обращаетесь к массиву b сверх его размера, используя указатель pb:
printf("*(pb + 9)= %d\n", *(pb + 9));
*(pb + 9) -> p[9] -> доступ к элементу 10th массива b вызывает неопределенное поведение, когда вы пытаетесь получить доступ к массиву вне пределов.
1) В языке C нет собственного типа нить. В C строки на самом деле представляют собой одномерный массив символов, заканчивающийся нулевым символом '\0'.
И a, и b одинаковы.
Однако есть небольшая разница. Массив a будет иметь Null Character, то есть \0 в последнем месте.
Где, поскольку массив b будет иметь ! в последнем индексе
I think a[] and b[] are exactly the same
Нет, они не такие.
char a[] = "Nice you!";
Это символьный массив, который соответствует всем критериям для "строки" C - он неявно завершается символом '\0'. Можно смело распечатывать с вызовами типа puts( a ).
char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'};
это просто массив символов. Это нет неявно завершается символом '\0'. Попытка распечатать его с помощью чего-то вроде puts( b ) - неопределенное поведение.
Ага, a[] и b[] почти одинаковы.
Здесь a[] - это строка (хотя в C нет типа данных с именем string). Он действует как автоматический массив символов, когда вы объявляете a[], как этот char a[] = "Nice you!", а компилятор помещает NUL ('\0'), который определяет конец строки.
Но когда вы объявляете что-то вроде этого char b[] = {'N', 'i', 'c', 'e', ' ', 'y', 'o', 'u', '!'}, это означает, что вы очень объявляете массив символов по-своему, а не так, как встроенный в массив char. Таким образом, он не содержит NUL ('\0') после '!'. Фактически, что напечатает второй массив b[], не определено.
Спасибо...!