请告诉我为什么访问CURLMsg结构的字段时会出现访问错误:
这是我正在使用的简单代码:
#include <iostream>
#include <string>
#include <curl.h>
int main()
{
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL* curl;
if (curl == CURL_OK)
{
CURLcode curl_easy_setopt_status;
curl_easy_setopt(curl, CURLOPT_URL, "https://www.cyberforum.com"); //сайт с заведомо некорректным сертификатом
curl_easy_setopt_status = curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1); //Установка редиректа
curl_easy_setopt_status = curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10); //Установка кол-ва редиректов
curl_easy_setopt_status = curl_easy_setopt(CURL_p, CURLOPT_SSL_VERIFYPEER, 1);
curl_easy_setopt_status = curl_easy_setopt(CURL_p, CURLOPT_SSL_VERIFYHOST, 1);
//Запуск http-запроса: ------->
CURLM* multi_handle;
CURLMcode CURLMcode_;
int still_running = 0;
multi_handle = curl_multi_init();
curl_multi_add_handle(multi_handle, curl);
CURLMcode_ = curl_multi_perform(multi_handle, &still_running);
CURLMsg* my_CURLMsg_multi_info_read; //Структура возвращаемая функцией curl_multi_info_read.
int my_msgs_in_queue_int;
while (still_running != 0)
{
CURLMcode_ = curl_multi_perform(multi_handle, &still_running);
if (CURLMcode_ == 0)
{
CURLMcode_ = curl_multi_poll(multi_handle, NULL, 0, 1000, NULL);
}
else
{
break;
}
my_CURLMsg_multi_info_read = curl_multi_info_read(multi_handle, &my_msgs_in_queue_int); //Запрашиваю структуру CURLMsg.
if (my_CURLMsg_multi_info_read != 0) //Если указатель действительный, то:
{
if (my_CURLMsg_multi_info_read->msg == CURLMSG_DONE)
{
//Теперь пытаюсь обратится к первому байту поля whatever:
std::cout << "whatever_address:" << my_CURLMsg_multi_info_read->data.whatever <<std::endl; //АДРЕСС НЕ НУЛЕВОЙ, то есть указатель действительный.
std::cout << "whatever:" << ((char*)(*my_CURLMsg_multi_info_read).data.whatever)[0] << std::endl; //ТУТ я терплю ОШИБКУ ДОСТУПА! Почему же так?
}
}
}
return 0;
}
CURLMSG 结构本身如下所示:
struct CURLMsg
{
CURLMSG msg; // what this message means == CURLMSG_DONE
CURL* easy_handle; // the handle it concerns
union
{
void* whatever; // message-specific data
CURLcode result; // return code for transfer
} data;
};
如果该字段 - 一个指向 void 的指针 - 被分配了一个地址,那么这意味着至少可以访问 1 个字节,那么我应该有,为什么会发生访问错误?
因此,该字段
whatever
不活跃,访问它需要 UB。即使将地址分配给指向 void 的指针,这也不意味着该地址是有效的,或者它可以访问至少 1 个字节