Доступ к значению, указанному указателем C

У меня есть следующий код:

    char * transfer_encoding;
    char coso;
    if (transfer_encoding = strstr(first_chunk.content, "Transfer-Encoding:")){

        coso = *(transfer_encoding + 18);
        printf(" %s ", coso);
}

Он просто ищет строку "Transfer-Encoding:" и затем пытается получить доступ к значению после ":" (18=len("Transfer-Encoding:")). Это дает мне нарушение прав доступа, читая адрес 0x0000020. Зачем? Я хочу пройти через байты после "Transfer-Encoding", чтобы найти "\r\n".

Чтобы уточнить вопрос. Я хочу пройти через байты ПОСЛЕ "Transfer-Encoding", чтобы найти "\r\n". Как мне это сделать? Спасибо.

3 ответа

Решение

Вы берете адрес после Transfer-Encoding:

transfer_encoding + 18

разыменовывать это

coso = *(transfer_encoding + 18);

и попытаться интерпретировать это как строку

printf(" %s ", coso);

Правильный путь будет

printf(" %s ", transfer_encoding + 18);

без разыменования.


Адрес 0x0000020 происходит от символа после двоеточия, которое обычно является пробелом. Это 32 или же 0x20 в ASCII.


Если вы хотите посмотреть содержимое этого адреса, вполне можно разыменовать указатель, например,

char cr = *(transfer_encoding + 18);
char nl = *(transfer_encoding + 18 + 1);
if (cr == '\r' && nl = '\n')
    printf("CRLF found\n");

Чтобы сравнить всю строку, вы также можете использовать strcmp или же strncmp

if (strncmp(transfer_encoding + 18, "\r\n", 2) == 0)
    printf("CRLF found\n");

Функция strstr возвращает ноль, когда строка "Transfer-Encoding:" отсутствует в содержимом, когда это происходит, вы получаете нарушение прав доступа. Попробуйте проверить, если указатель не является нулевым, прежде чем продолжить, как это:

   char * transfer_encoding;
   char * coso;
   if ((transfer_encoding = strstr(first_chunk.content, "Transfer-Encoding:"))){
     if (transfer_encoding != NULL){
        coso = transfer_encoding + 18;
        printf(" %s ", coso);
     }
   }

Надеюсь, поможет!

РЕДАКТИРОВАТЬ: Отлично, тогда у вас есть другая проблема с указателем, вы явно берете 1 символ из строки вместо того, чтобы получить указатель на то, что осталось в строке, попробуйте еще раз, пожалуйста

Компилятор, вероятно, предупредил вас об этом коде.

Вы держите символ после двоеточия вместо того, чтобы указывать туда:

char *transfer_encoding;
char *coso;
if (transfer_encoding = strstr(first_chunk.content, "Transfer-Encoding:"))
{
    coso = transfer_encoding + 18;
    printf(" %s ", coso);
Другие вопросы по тегам