char * p
- указатель на память где-то, которая должна содержать символы.Там нет конца данных подразумевается.char a[100]
- это раздел из 100 символов памяти.Конец a известен компилятору для доступа к многомерным массивам и для параметров функции проверки ошибок.& a [0] или просто a (адрес элемента 0 of a) в основном совпадает с char *.
Пользователь a или p должен как-то знать длину:
1) aПараметр длины предоставляется дополнительно.Пример: sizeof(a)
(в байтах).Мне также нравится использовать numof(a)
, который может содержать элементы вместо размера байта, добавив: #define numof(X) (sizeof(X)/sizeof(*X))
Вместо длины, вы также можете использовать другой указатель на конец, чтобы остановиться на.
2) некоторый контентили правило, которое сообщает пользователю p, когда остановиться.Пример: *p == 0
(NULL)
Это мощный источник гибкости в C / C ++ (а также опасность при неправильном использовании).
a) Изменить пользователя массива также можноограничение длины или указатель до конца, чтобы остановиться на.Вам также может понадобиться проверка нулевого завершения в случае, если последний блок меньше размера.
b) Обрабатывать данные только по одному блоку за раз.Тогда вы только новый 1 дополнительный массив из 20 символов.Или, если вы можете гарантировать, что другие потоки не будут использовать массив одновременно, вы можете временно изменить нулевое завершение:
// array is assumed to be a multiple of 20 plus 1 more for null
char * ptr = array;
while ( ptr < array + sizeof(array)-1 )
{
char * end = ptr + 20; // we will stop here
char save_char = *end; // save the character there
*end = 0; // put in temporary null
ProcessBlock( ptr ); // now null terminated !
*end = save_char; // restore the array
ptr = end; // end of this block is start of next
}