C/C++
Язык С почему при обращении к отдельным символам массива/строкам, а именно str[0-1] то есть индекс -1 выводит значение 0
Разве здесь не должна быть ошибка. типа Segmentation fault и вообще когда такое встречается в коде это нормально? Я знаю что можно индексы минусовать, увеличивать, выполнять внутри квадратных скобках вычисления и т.д
Язык С рассчитан на тех, кто понимает что он делает. То что у вас по индексу -1 значение равное 0 просто совпадение. Вы захотели выстрелить себе в ногу, сэр Самюэль Кольт вам этого не запрещает.
Никто не запрещает использовать обращение к элементам массива по отрицательным индексам, если известно. что там лежит.
#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]); с тем же результатом :)
#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]); с тем же результатом :)
Ошибка стека может возникнуть если вы читаете за пределами статического массива. И скорее всего непредвиденно извлекаете какую-нибудь важную команду из стека. И из за этого ломается вся очередь выполнения. Но может и не быть никакой ошибки, если на месте вашего индекса находится какая нить ваша переменная. А при записи в нее получите непредсказуемое поведение. Хотя нарушение стека - тоже может привести к этому. К примеру ошибок не будет, но там где вы ожидали один результат - выползет другой.
Cторожев Валерий
При чтении не может быть "ошибки стека". Если будет ошибка (что маловероятно), то не ошибка стека.
Сергей Ильин
Совсем недавно неправильно написал заполнение и чтение статического массива. Типа M[10]; где обращение к элементам было через *(M+i) (i=от 0 до 9). Программа проходила участок заполнения массива. А сразу после печати 10 элементов (вроде как на этом и конец программы должен быть) выдавала ошибку целостности стека. Причем когда комментировал печать - ошибки не было. Готов сьесть свою треуголку!
Всё дело в том, ЧТО из себя представляет строка в языке Си. Принципиально Си-строка это указатель на первый символ строки. А применение квадратных скобок к указателям воспринимается как разыменование выражения с указателем. Причём, выполняется это не компилятором, а самой программой в процессе её исполнения.
Конкретный компилятор может и не осуществлять контроль за соблюдением границ при обращении к элементу не-статического массива.
Конкретный компилятор может и не осуществлять контроль за соблюдением границ при обращении к элементу не-статического массива.
Похожие вопросы
- Ввод массива строк с помощью рекурсии
- Как реализовать программу, в которой массив заполняется рандомно, а сумма его элементов всегда будет равна 1? С++
- Задача в С++ на знание массивов, строк, файлов и тд
- Почему именно return 0;? Почему не return 5, 6, 10 например? Результат программы будет отличаться и как?
- Если getch() просто стоит.Без символа.Без переменной. Ну как return 0; в конце.Зачем тогда,этот getch()?
- Последовательности из 0, 1 и 2 без двух единиц и двоек подряд
- Почему два раза просит ввод с++ да я хочу именно так это сделать не ругайетсь
- Как сделать сортировку массива по убыванию, сохранив индексы на языке C
- Двумерный динамический массив с неизвестны количеством столбиков или строк
- Как узнать количество символов в UTF8 массиве?(Си)