C/C++

Язык С почему при обращении к отдельным символам массива/строкам, а именно str[0-1] то есть индекс -1 выводит значение 0

Разве здесь не должна быть ошибка. типа Segmentation fault и вообще когда такое встречается в коде это нормально? Я знаю что можно индексы минусовать, увеличивать, выполнять внутри квадратных скобках вычисления и т.д
Язык С рассчитан на тех, кто понимает что он делает. То что у вас по индексу -1 значение равное 0 просто совпадение. Вы захотели выстрелить себе в ногу, сэр Самюэль Кольт вам этого не запрещает.
Igor Garr
Igor Garr
54 675
Лучший ответ
Никто не запрещает использовать обращение к элементам массива по отрицательным индексам, если известно. что там лежит.
#include "stdio.h"
int main(){int a[]={1,2,3,4,5,6}; int *b=a+3; printf("%d",b[-2]);}
И, более забавно, можно было написать и printf("%d",(-2)[b]); с тем же результатом :)
Ошибка стека может возникнуть если вы читаете за пределами статического массива. И скорее всего непредвиденно извлекаете какую-нибудь важную команду из стека. И из за этого ломается вся очередь выполнения. Но может и не быть никакой ошибки, если на месте вашего индекса находится какая нить ваша переменная. А при записи в нее получите непредсказуемое поведение. Хотя нарушение стека - тоже может привести к этому. К примеру ошибок не будет, но там где вы ожидали один результат - выползет другой.
Сергей Ильин
Сергей Ильин
51 411
Cторожев Валерий При чтении не может быть "ошибки стека". Если будет ошибка (что маловероятно), то не ошибка стека.
Сергей Ильин Совсем недавно неправильно написал заполнение и чтение статического массива. Типа M[10]; где обращение к элементам было через *(M+i) (i=от 0 до 9). Программа проходила участок заполнения массива. А сразу после печати 10 элементов (вроде как на этом и конец программы должен быть) выдавала ошибку целостности стека. Причем когда комментировал печать - ошибки не было. Готов сьесть свою треуголку!
   Всё дело в том, ЧТО из себя представляет строка в языке Си. Принципиально Си-строка это указатель на первый символ строки. А применение квадратных скобок к указателям воспринимается как разыменование выражения с указателем. Причём, выполняется это не компилятором, а самой программой в процессе её исполнения.
   Конкретный компилятор может и не осуществлять контроль за соблюдением границ при обращении к элементу не-статического массива.
YF
Yegor F.c.b.b.
16 172