Некоторые причины порчи памяти в программах на C
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено smav 14 апреля 2005 г. 11:31
В ответ на: Глупый вопрос. А в ИАРе нельзя включить проверку индекса массива на допустимый диапазон, как было например, в досовом Паскале ? Где-то подтираются данные... отправлено Vladimir Ljaschko 14 апреля 2005 г. 10:26

Это для тех, кто программировал на паскале (как я)
Принципиальное отличие [] в паскале и С. В паскале [] - это доступ к элементу массива и может применяться только к массиву.
В С [] - операция "вектор", может применяться к любому указателю и имеет определенный приоритет. 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