[英]Mallocing pointer to array of structs
嗨,我正在尝试使用一些自定义库来制作 HTTP 响应。 库函数需要一个指向自定义结构 HttpHeader 数组的指针。 代码下方是手册页中的一个片段。 我想知道如何初始化它,以便“Content-Length”填充名称并填充值,然后数组中的下一个 HttpHeader 是手册页指定的 NULL 指针。 下面是我目前拥有的代码,但我的系统在为标头分配原始内存时出错。 “错误:'HttpHeader' HttpHeader** headers = malloc(sizeof(**HttpHeader)) 之前的预期表达式;”
任何帮助将不胜感激谢谢!
void populate_header(HttpHeader** headers, char* value) {
headers[0]->name = malloc(sizeof(char) * strlen("Content-Length"));
headers[0]->value = malloc(sizeof(char) * strlen(value));
strcpy(headers[0]->name, "Content-Length");
strcpy(headers[0]->value, value);
}
char* process_address(char** addrContents) {
HttpHeader** headers = malloc(sizeof(*HttpHeader));
char* body = NULL;
char* response = NULL;
if (strcmp(addrContents[1], "validate") == 0) {
populate_header(headers, "0");
if (!check_expression(addrContents[2])) {
response = construct_HTTP_response(400, "Bad Request", headers, body);
} else {
response = construct_HTTP_response(200, "OK", headers, body);
}
} else if (strcmp(addrContents[1], "integrate") == 0) {
if (!check_expression(addrContents[2])) {
populate_header(headers, "0");
response = construct_HTTP_response(400, "Bad Request", headers, body);
} else {
response = construct_HTTP_response(200, "OK", headers, body);
}
} else {
populate_header(headers, "0");
response = construct_HTTP_response(400, "Bad Request", headers, body);
}
//printf("Response: %s\n", response);
return response;
}
======================================== 从手册页
headers
points to an array of HttpHeader* (see below), each containing the name of value of a HTTP header. The last entry in headers will be a NULL
pointer.
HttpHeader
A HttpHeader is defined as follows:
typedef struct {
char* name;
char* value;
} HttpHeader;
Memory for name and value is allocated separately.
sizeof(*HttpHeader)
是问题所在。 *
取消引用一个指针。 HttpHeader
是一种类型,取消引用类型没有意义。
你想要sizeof(HttpHeader*)
。 这是指向HttpHeader
的指针的HttpHeader
。
malloc(sizeof(HttpHeader*));
只为单个指针分配空间。 如果要为多个头分配空间,则需要相乘。 例如,如果您想要五个标头的空间: malloc(sizeof(HttpHeader*) * 5);
最后,数组应该以空值终止,以便它知道何时停止读取数组。 分配比您需要的多一个指针,并将最后一个元素设置为空。
// Space for two headers, the last is a null.
HttpHeader** headers = malloc(sizeof(*HttpHeader) * 2);
headers[1] = NULL;
类似地,C 中的字符串以 null 结尾。 您必须比字符串的长度多分配一个字节。
sizeof(char)
被定义为 1,你可以省略它。
void populate_header(HttpHeader** headers, char* value) {
headers[0]->name = malloc(strlen("Content-Length") + 1);
headers[0]->value = malloc(strlen(value) + 1);
strcpy(headers[0]->name, "Content-Length");
strcpy(headers[0]->value, value);
}
更好的是,使用strdup
。
void populate_header(HttpHeader** headers, char* value) {
headers[0]->name = strdup("Content-Length");
headers[0]->value = strdup(value);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.