Укажите один символ только для чтения в C? - PullRequest
2 голосов
/ 26 марта 2011

Можно ли сделать один символ доступным только для чтения в C? (Я хотел бы сделать '\ 0' доступным только для чтения, чтобы избежать переполнения буфера.)

char var[5 + 1] = "Hello";

var[5] = '\0'; // specify this char as read-only ?

Ответы [ 5 ]

4 голосов
/ 26 марта 2011

Вы не можете создать смешанный const / non- const массив или строку. \0 не перезаписывается, должно гарантироваться инвариантами в вашей программе.

1 голос
/ 26 марта 2011

строго говоря, нет.В некоторых системах вы можете получить нечто похожее, играя с компоновщиком, например, указав адрес «var» и сделав его равным 5 байтам перед разделом «только для чтения».Но это работает только в очень немногих случаях, и в любом случае это не часть языка C.

1 голос
/ 26 марта 2011

Не можете этого сделать, вы должны убедиться в правильной практике.

0 голосов
/ 26 марта 2011

Используйте const char * ptr, который отслеживает ваши \0.

0 голосов
/ 26 марта 2011

Нет, такая концепция области памяти, доступной только для чтения, вообще не существует в C. C Программисты остаются самостоятельно при выделении / доступе / манипулировании памятью, и они должны знать, что они делают:Такова ответственность, которая исходит от необработанной власти: D.

Если вы можете переключиться на C ++, тогда вы можете рассмотреть возможность использования std :: vector.Хотя переполнение буфера все еще возможно при использовании std :: vectors, они менее вероятны при использовании методов, содержащихся в интерфейсе класса.Этот метод абстрагирует доступ к элементам и их вставку, поэтому вам не нужно явно управлять памятью.Обратите внимание, что вы все равно можете получить прямой доступ к элементу, который находится за пределами векторного размера, если вы не используете итераторы.

Поскольку переполнения - это повторяющиеся проблемы в c / c ++, существует несколько инструментов, которые помогают программисту справляться с подобными ошибками.Инструменты варьируются от статического анализатора языка до обнаружения во время выполнения незащищенного доступа к памяти в режиме отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...