2017-03-26 106 views
-2
size_t writeFunctionHandler(char *contents,size_t size,size_t nmemb,void *userdata) { 
    // size of the storedSize 
    static size_t storedSize = 0; 

    // the size of data available 
    size_t realSize = size * nmemb; 

    char *dataBuffer = (char *) userdata; 

    // realloc the buffer buffer 
    dataBuffer = realloc(dataBuffer,storedSize + realSize); 

    if (dataBuffer == NULL) { 
    printf("Could not allocate memory \n"); 
    return 0; 
    } 

    // store the contents of realSize from last storedSize 
    memcpy(&(dataBuffer[storedSize]),contents,realSize); 

    storedSize += realSize; 
    return realSize; 
} 

我不明白,为什么被realloc'd 指针上面的代码返回值和错误没有被分配指针被realloc'd没有被分配

当我使用此示例代码

struct MemoryStruct { 
    char *memory; 
}; 

size_t writeFunctionHandler(char *contents,size_t size,size_t nmemb, void *userdata) { 
    size_t realSize = size * nmemb; 
    static size_t storedSize = 0; 
    //char *dataBuffer = (char *)userdata; 
    struct MemoryStruct *chunk = (struct MemoryStruct *)userdata; 

    printf("print 1\n"); 
    chunk -> memory = realloc(chunk -> memory,storedSize + realSize); 
    printf("print 2\n"); 

    if (chunk -> memory == NULL) { 
    printf("Could not allocate memory\n"); 
    return 0; 
    } 

    memcpy(&(chunk -> memory[storedSize]),contents,realSize); 
    storedSize += realSize; 
    printf("print 3\n"); 

    return realSize; 
} 

所有似乎工作正常罚款。

上面这是一个卷曲writeFunctionHandler

int main() { 
    char *buffer = calloc(1,1); 
    // struct MemoryStruct chunk; 
    // chunk.memory = calloc(1,1); 

    CURL *curl = curl_easy_init(); 

    curl_easy_setopt(curl, CURLOPT_URL, "http://stackoverflow.com"); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeFunctionHandler); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)buffer); 
    // curl_easy_setopt(curl,CURLOPT_WRITEDATA, (void *) &chunk); 

    free(buffer); 
    //free(chunk.memory); 
    curl_easy_cleanup(curl); 

    return 0; 
} 

我不明白,我在后一种情况下使用2代码之间有什么区别,除了事实struct

+0

你确定** sample **函数在最后一个'curl_easy_setopt'和'free(chunk.memory)'之间没有任何东西吗? – StoryTeller

+0

@StoryTeller这里的实际代码如何看起来像https://gist.github.com/anonymous/9274da0998124dc9576f28e52327af87 – Ratatouille

+0

对不起,但你给的链接只是一个404 – StoryTeller

回答

3

问题是,userdata指向包含成员memory的结构,它是从堆中分配的成员。

此外,函数返回时,memory可能已被realloc更改,但是在您的版本中,更改无法在函数外部看到。这是因为指针的已通过,而不是地址。如果地址通过了(即void **userdata),那么你就可以接收到该地址(即*userdata= realloc(..),并且它将在该函数外面显示出来。

相关问题