如何将字符*附加到void*的末端
How to append a char* to the end of a void*?
假设我们已经定义了一个char*如下:
char *x;
我们具有类似的功能:
void append(void *y, char *z);
此函数将其附加为第二个参数(指针 Z 指向),该函数指向字符串的末尾,指针 y 指向它的开始。我被限制为第一个参数为 void*的原因是我需要覆盖libcurl函数:
size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata);
任何时候称为header_callback函数,我需要将缓冲区附加到用户达塔的末尾。UserData指针指向字符串的开始。
根据您链接的文档, userdata 是先前提供给 curlopt_headerdata 的指针。这样的东西可能对您有用。
size_t header_callback(char *buffer, size_t size, size_t nitems, vector<string> *userdata)
{
userdata->push_back(string(buffer, size*nitems));
return size*nitems;
}
//...
vector<string> headers;
curl_easy_setopt(curl, CURLOPT_HEADERDATA, &headers);
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback);
//...
无法实现您的
void append(void *y, char *z);
以一种可以附加非终止字符序列的方式。
给出回调的char *buffer
是非终止的。
另外,在调用附加之前,您可以将空隙指针转换为回调中的正确类型的缓冲区。最终必须这样做,因为您不能将任何内容附加到无效。
您几乎不需要外部功能,因为附加非常微不足道。假设您的void*
指向std::string
:
auto bytes = size * nitems;
auto str = (std::string*)userdata;
str->append(buffer, bytes);
应该定义数据以缓冲这些内容:
- 允许目标缓冲区的尺寸
- 目的地缓冲区中存在的缓冲区中的数据量
- 要复制到目标缓冲区的数据量
在C realloc()中可用于创建具有旧内容的新缓冲区。在C 中,有新操作员的风味允许类似的动作。
如果我们假设存储的数据严格为null终止字符串(但没有指定!),则已知第二个和第三个 - 缓冲区的大小不知道append()是缓冲区的大小。因此,功能
void append(void *y, char *z);
看起来不适合任务,或者非常不安全,也可能不适合定义,除非void y实际上是某种结构或类(但将其作为void ???)
您没有提供其实现或描述。外观应该是相当有限的。我们应该预先分配适当尺寸的缓冲区,并确保Append()不会超出其范围。它无法重新分配目标缓冲区,因此它受到已经分配的内存的限制。实际上要重新分配目标缓冲区附加将使void **y
或void &* y
作为正式参数(realloc() May 更改指针, die 将数据从旧缓冲区复制到新的缓冲区
这构成了架构问题 - 缓冲区的所有权。如果我们通过缓冲区控制,我们可以正确分配它并将其传递给附加()或将所有权传递给Append(),以便将其重新分配。如果不这样做,我们必须创建一个时间缓冲区...但是以后我们可以使用该时间缓冲区吗?
除非您使用自定义标头写入功能,否则要点是毫无意义的。用户数据指针是curlopt_headerdata,它是指向有效文件的指针,您应该_fwrite()数据...或者,如果您正在实现curlopt_writefunction and curlopt_readfunction andback,则可以通过酌情使用Callbacks的设计师来使用该指针指向一些有用的数据容器(Libcurl使用FWRITE作为默认回调)。
您的问题看起来更涉及C(不是C )方法。那么您需要以下内容:
- 知道y 的大小
- 真正的y y y y 1
- memcpy/memmove y到新地方
- 将新缓冲区的最后一个字节设置为z
- 返回用户指针和新缓冲区的大小
- 释放旧的缓冲区y(取决于需要)。
在C hovewer中,您需要使用一些容器,例如std :: vector,这将允许您附加一个字节。
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 在带有 (void*) 强制转换的字符串中打印字符的内存地址
- 如何将字符*附加到void*的末端
- 将 void (*)() 转换为 void (*)(无符号字符)
- 视觉工作室中涉及 void*、字符串和常量字符 [] 的意外重载解决方案
- 在 C 中,我可以将 void* 分配给字符*,但不能在 C++ 中分配
- 从“void*”到“无符号字符*”的转换无效
- reinterpret_cast<字符*>(p)或static_cast<字符*>((void*)p))表示字节指针差,哪个更好?
- 正在将内存分配给二维字符数组,错误:从“void*”到“char**”的转换无效
- 从"void"转换为非标量类型"std::p air<std::basic_string<字符,std::char_traits<char>
- 为什么我可以使用 static_cast 与 void* 而不是与字符*
- 视觉 任何非(字符*)正确的方法,用于从 C++ 中的常量字符串初始化 void*