Доступ к значению, указанному указателем 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);