我正在尝试编写一个生成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, ...); }
哪一个更接近生成标题的“规范”方式?在第二种方法中,我需要释放内存,而在第一种方法中我不会,对吧?
由于
答案 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();
通过让您完全控制分配足够内存来保存内容的过程,可以避免上述大多数问题。但是,调用者现在被迫释放内存。
对于任何类型的动态内容,我都会使用第三个选项。