gpt4 book ai didi

c - 如何更改 char* 的内存地址?

转载 作者:行者123 更新时间:2023-11-30 15:04:57 27 4
gpt4 key购买 nike

我正在处理一个问题,我无法获取 abs_path 和查询数组,该数组填充了我在函数解析内部传递给它们的数据。这个函数内部的逻辑似乎是正确的,我已经对其进行了调试,并且两个数组都填充了正确的数据。我知道我没有在参数中传递指向数组(char**)的指针,因为函数的参数无法更改。关于解决这个问题还有其他建议吗?

#define LimitRequestLine 8190
char abs_path[LimitRequestLine + 1];
char query[LimitRequestLine + 1];

bool parse(const char* line, char* abs_path, char* query)
{
char* method = "GET ";
char* valid_http = "HTTP/1.1";
int index, method_size;
char abs_path_line[LimitRequestLine + 1];
char query_line[LimitRequestLine + 1];
int abs_path_index;

if(strstr(line, "HTTP/")!=NULL && strstr(line, valid_http) == NULL) {
error(505);
return false;
}

//make sure that our method is GET
for(index = 0, method_size = strlen(method); index<method_size; index++) {
if(line[index] != method[index]) {
error(405);
return false;
}
}

//check if request-target starts with '/'
if(line[index]!='/') {
error(501);
return false;
}

for(abs_path_index = 0; index < strlen(line); index++) {

//if there is a quotation mark, then we have a query in request-target
if(line[index] == '?') {
index++;
int query_index;

for(query_index = 0; line[index]!=' '; index++) {

//check if there is quote mark in query
if(line[index] == '"') {
error(400);
return false;
}

query_line[query_index] = line[index];
query_index++;
}

query_line[query_index] = '\0';
}

//assuming that we have not found any '?' mark for query.
if(strstr(line, "?") == NULL) {
query_line[0] = '\0';
}

if(line[index] == ' ') {

int temp = index;
index++;

/*After the space there should be a valid http, if it is not found,
then there is/are spaces in our request-line which is incorrect*/
for(int i=0; i<strlen(valid_http); i++) {
if(line[index] != valid_http[i]) {
error(400);
return false;
}
index++;
}

index = temp;
break;
}

//check if there is quote mark in abs_path
if(line[index] == '"') {
error(400);
return false;
}

abs_path_line[abs_path_index] += line[index];
abs_path_index++;
}

abs_path_line[abs_path_index] += '\0';

abs_path = abs_path_line;
abs_path += '\0';
query = query_line;
printf("abs path is %s\n", abs_path);
printf("query is %s\n", query);


return true;
}

最佳答案

问题是这样的:

query = query_line;

char *query 表示您传递了一个指针。它只是一个像任何其他数字一样的数字。这样想吧。

void set_number(int number) {
number = 6;
}

你希望这能起到什么作用吗?没有。与 query = query_line 相同。

相反,query 指向一大块内存。您需要将 query_line 复制到 query 指向的内存中,并希望有足够的分配空间。

strncpy(query, query_line, LimitRequestLine);
<小时/>

需要调用者分配内存的函数是即将发生的内存问题。我建议不要修复这个问题......

  1. 编写一个具有更好签名的新函数,也许会返回一个结构。
  2. 实现这个旧函数作为新函数的包装器。
  3. 弃用此功能。
<小时/>

请注意,函数中的query 与函数外部声明的query 不同。

关于c - 如何更改 char* 的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40063350/

27 4 0
文章推荐: javascript - javascript 字符串中后跟小写字母的反斜杠破坏了字符串
文章推荐: C#滚动条在DataGridView更新时不断重置
文章推荐: javascript - 使用箭头函数作为传递给 requestAnimationFrame 的方法
文章推荐: c# - 使用 AutoMapper 从 ICollection 映射到 ICollection 到 ICollection