如何将字符*附加到void*的末端

How to append a char* to the end of a void*?

本文关键字:void 字符      更新时间:2023-10-16

假设我们已经定义了一个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 **yvoid &* y作为正式参数(realloc() May 更改指针, die 将数据从旧缓冲区复制到新的缓冲区

这构成了架构问题 - 缓冲区的所有权。如果我们通过缓冲区控制,我们可以正确分配它并将其传递给附加()或将所有权传递给Append(),以便将其重新分配。如果不这样做,我们必须创建一个时间缓冲区...但是以后我们可以使用该时间缓冲区吗?

除非您使用自定义标头写入功能,否则要点是毫无意义的。用户数据指针是curlopt_headerdata,它是指向有效文件的指针,您应该_fwrite()数据...或者,如果您正在实现curlopt_writefunction and curlopt_readfunction andback,则可以通过酌情使用Callbacks的设计师来使用该指针指向一些有用的数据容器(Libcurl使用FWRITE作为默认回调)。

您的问题看起来更涉及C(不是C )方法。那么您需要以下内容:

  1. 知道y
  2. 的大小
  3. 真正的y y y y 1
  4. memcpy/memmove y到新地方
  5. 将新缓冲区的最后一个字节设置为z
  6. 返回用户指针和新缓冲区的大小
  7. 释放旧的缓冲区y(取决于需要)。

在C hovewer中,您需要使用一些容器,例如std :: vector,这将允许您附加一个字节。