|
Это для тех, кто программировал на паскале (как я)
Принципиальное отличие [] в паскале и С. В паскале [] - это доступ к элементу массива и может применяться только к массиву.
В С [] - операция "вектор", может применяться к любому указателю и имеет определенный приоритет. p[n] аналогично p+n.
Пример проблемы:
Нужен указатель на массив указателей.
В паскале:
p:^array[0..5] of ^char;
p^[4]:=nil - запись в четвертый элемент массива
В С:
typedef char * TArr[5];
TArr * p;
*p[4]=NULL; - порча памяти.! Запись в область памяти, на которую указывает p+4. Операция [] имеет приоритет выше чем *.
Нужно: (*p)[4]=NULL.
Кстати NULL в С обычно 0, а 0 можно записывать в любой указатель без приведения типа, поэтому проблема может возникнуть при записи 0 в любой массив, не обязательно массив указателей.
Другие возможные причины порчи памяти и стека:
Передача указателей на локальные переменные функции, если они запоминаются и используются после возврата из функции.
Вызов функций с переменным числом параметров (printf,sprintf) с неправильными аргументами.
Ну и естественно не зависимо от языка:
Внимательно просмотреть все операции приведения типа.
Естественно - сохранение контекста в обработчиках прерывания (должна быть директива _INTERRUPT или что-то вроде того)
...
E-mail: info@telesys.ru