Любые подводные камни с использованием 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) определенно нельзя полагаться на-Я знаю реализации, для которых это ложно (и хотя они, вероятно, не полностью соответствуют стандарту, это не одна из их проблем).