gpt4 book ai didi

c - 正在重新分配的指针未分配

转载 作者:行者123 更新时间:2023-11-30 20:04:13 24 4
gpt4 key购买 nike

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;
}

我无法理解为什么上面的代码返回并出现错误未分配正在重新分配的指针

当我使用这个示例代码时

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;
}

一切似乎都工作正常。

上面是一个curl 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;
}

除了我在后一种情况下使用 struct 之外,我无法理解这两个代码之间有什么区别。

最佳答案

重点是 userdata 指向包含成员 memory 的结构,并且该成员是从堆中分配的。

此外,当函数返回时,内存可能已随 realloc 更改,但在您的版本中,在函数外部无法看到更改。这是因为传递的是指针的,而不是地址。如果地址被传递(即 void **userdata),您将重新分配到该地址(即 *userdata= realloc(..)),并且它将变得可见在函数之外。

关于c - 正在重新分配的指针未分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43025713/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com