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

时间:2016-10-15 19:30:09

标签: c arrays char

我正在处理一个问题,我无法获得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;
}

1 个答案:

答案 0 :(得分:1)

问题在于:

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. 弃用此功能。
  4. 请注意,函数中的query与函数外部声明的query不同。