Любые подводные камни с использованием char * вместо void* при написании кросс-платформенного кода?
есть ли какие-либо подводные камни при использовании char*для записи кроссплатформенного кода, который имеет доступ к памяти?
UPDATE: например, должен ли я проверять перед приведением разыменованного символа* к определенному типу (скажем, int), если адрес выровнен по размеру этого типа? Будут ли определенные архитектуры возвращать странные результаты при несогласованном доступе?
Я работаю над распределителем памяти воспроизведения, чтобы лучше понять, как отлаживать проблемы memmory. Я пришел к убеждению, что char * предпочтительнее из-за способности делать арифметику указателей и разыменовывать их над void*, это правда? Всегда ли выполняются следующие предположения на разных общих платформах?
sizeof(char) == 1
sizeof(char*) == sizeof(void*)
sizeof(char*) == sizeof(size_t)
1 ответов
sizeof(char)==1
безусловно, всегда верно.
sizeof(char *) == sizeof(void *)
is наверное всегда верно. Стандарт C требует, чтобы они имели одинаковое представление, которое, по крайней мере, сильно подразумевает одинаковый размер.
sizeof(char *) == sizeof(size_t)
определенно нельзя полагаться на-Я знаю реализации, для которых это ложно (и хотя они, вероятно, не полностью соответствуют стандарту, это не одна из их проблем).