Как я могу проверить, указывает ли указатель на символ ничто после выделенного - PullRequest
0 голосов
/ 20 ноября 2018

Я выделил память для указателя char в этом коде, и я хотел проверить, указывает ли он что-нибудь:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
    char *p  = (char*) malloc(sizeof(char)*10);
    if(*p == 0)
       printf("The pointer points nothing !\n");

}

И я проверил это, если это ничего не указывает. Также я печатаю длину указателя, и он печатает «3», хотя ничего не печатает. В чем причина этого и как я могу проверить, ничего не указывает?

1 Ответ

0 голосов
/ 20 ноября 2018

Вам нужно изменить проверку, чтобы проверять возвращаемый указатель, а не содержимое.Что-то вроде

if( p == NULL) {
    fprintf(stderr, "The pointer points nothing !\n");
    return 1;
 }

должно делать.Цитирование стандарта относительно возвращаемых значений:

Функция malloc возвращает либо нулевой указатель, либо указатель на выделенное пространство.

Пустой указатель возвращается вслучай сбоя, в противном случае возвращаемый указатель должен быть не равен нулевому указателю.

При этом

  • Исходное содержимое указанной памяти не определено,не пытайтесь это проверить.Цитируя из стандарта,

    Функция malloc выделяет пространство для объекта, размер которого указан в size и , значение которого не определено.

    Это касается другого вашего вопроса относительно «проверки длины» указателя - это бессмысленно.Если вы не сохранили (запишите) какое-либо значение в нем - нет смысла пытаться измерить исходное содержимое, поскольку оно неопределенное.В конечном итоге вы можете столкнуться с неопределенным поведением .

  • Приведение для возвращенного указателя на malloc() и семейство излишни. Его можно полностью избежать в C.

  • sizeof(char) гарантированно равно 1, в C. Таким образом, использование sizeof(char) в качестве множителя сноване требуется, per se .

...