Może nie tyle sprzeczne co zagmatwany opis.
Mój błąd bo faktycznie przy wyłuskiwaniu adresu trzeba było zrzutować wskaznik na typ (char**) a nie (char*).
Jakby nie patrzeć w funkcji był przekazywany adres zmiennej wskaźnikowej typu void, która zawierała adres zaalokowanego bloku pamięci, więc jakby nie patrzeć wyłuskując taki adres to mamy do czynienia ze wskaźnikiem do wskaźnika.
A kod wygląda tak:
char* data = (char *)malloc(sizeof(char) * 1);
CURL* curl;
/.../
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); // tutaj z uwagi na realokacje pamieci trzeba bylo wyslac adres zmiennej wskaznikowej
// funkcja dla curla
size_t writeCallback(char* buffer, size_t size, size_t nmemb, void* userdata)
{
char* data = *(char**)userdata; // wskaznik na dane - wyluskanie wskaznika z przekazanego adresu zmiennej zewnetrznej
void *tmp; // tymczasowy wskaznik dla realokowania pamieci
size_t realsize = size * nmemb; // ilosc pobranych danych przez writeCallback
int i = 0; // licznik dla petli pobierajacej dane z bufora
static int totalsize = 0; // suma pobranych danych
totalsize += realsize + 1;
if( (tmp = realloc(data, totalsize * sizeof(char))) == NULL)
{
printf("blad podczas realokacji pamieci \n");
return realsize;
}
else
{
*(char**)userdata = tmp; // ustawienie adresu nowo zaalokowanego obszaru pamieci
data = (char *)tmp;
memset(data + (totalsize - realsize), 0, realsize);
}
for(i = 0; i < realsize; ++i)
{
*(data + length + i) = *(buffer + i);
}
return realsize;
}