返回char *或使用memcpy?

时间:2015-05-13 15:25:39

标签: c http

我正在尝试编写一个生成HTTP请求标头的函数。我目前有类似

的东西
static char* genHeader() { 
    return("POST / HTTP/1.1\r\n\
            Host: www.example.com\r\n\
            Content-Type: application/x-www-form-urlencoded\r\n\r\n"); 
}

我知道也可以通过以下方式完成:

static void genHeader(char *header) { memcpy(header, ...); }

哪一个更接近生成标题的“规范”方式?在第二种方法中,我需要释放内存,而在第一种方法中我不会,对吧?

由于

3 个答案:

答案 0 :(得分:5)

第一种方法更好,如果字符串不会改变或者某些字段被函数填充,那么第一种方法更容易实现,必须跟踪堆上分配的内存总是很难,没有必要在你的情况下这样做,你甚至可以使用宏,如

#define HTTP_HEADER \
    "POST / HTTP/1.1\r\n" \
    "Host: www.example.com\r\n" \
    "Content-Type: application/x-www-form-urlencoded\r\n\r\n"

而不是功能。

您需要动态生成标头的情况,例如因为Host更改,需要第二个解决方案,因为您需要为标头分配足够的空间,然后构建标题字符串。

在这种情况下,如果函数负责将指针返回到新分配的构建字符串会更好,但是,调用方应负责调用free()

此外,return语句中绝对不需要括号,这使代码难以阅读。

答案 1 :(得分:0)

这不是一个正确的问题,因为您的示例会生成一个文字标题。在现实生活中,我认为它将具有动态内容。问题是关于如何生成动态字符串内容。要生成可变大小和内容字符串,您需要在堆上分配它(除非您希望对静态内存池进行真正的努力)。这表明你需要

static char * MakeHeader(...);

并告诉调用者完成后释放结果。

答案 2 :(得分:0)

函数有几种生成字符串的方法:

  • 返回指向静态指针的指针,如第一个示例所示。这很简单,不需要内存管理,但必须在编译时知道字符串的内容。

  • 将字符串复制到调用者提供的缓冲区中,例如sprintf()

    void genHeader(char* buffer, size_t length);
    

    这会将字符写入buffer,直到达到length。它通过强制调用者分配内存使genHeader()更简单。但是,可能无法预先知道要分配多少内存,在这种情况下,调用者将分配太多或太少。如果genHeader()为空,或者某些变体,您可以buffer返回缓冲区大小。

  • 自己分配字符串:

    char* genHeader();
    

    通过让您完全控制分配足够内存来保存内容的过程,可以避免上述大多数问题。但是,调用者现在被迫释放内存。

对于任何类型的动态内容,我都会使用第三个选项。