C - 调试内存问题

时间:2016-02-27 15:00:58

标签: c memory

我是C的新手,第二次调用函数时我得到了意想不到的值。

我不明白为什么会发生这种情况,因为我正在为methodtargetversion分配新的内存。

first run:
GET / HTTP/1.1
method: 'GET', target: '/', version: 'HTTP/1.1'

second run:
GET / HTTP/1.1
method: 'GET�1', target: '/�1', version: 'HTTP/1.1��1'

代码:

bool parse(const char* line, char* abs_path, char* query)
{
    char* method = malloc(LimitRequestLine + 1);
    char* target = malloc(LimitRequestLine + 1);
    char* version = malloc(LimitRequestLine + 1);

    // iterate over chars from line and set method, target and version respectively
    for (int i = 0, j = 0, part = 0, n = strlen(line); i < n; i++) {
        if (line[i] == ' ') {
            part++;
            j = 0;
            continue;
        } else if (line[i] == '\r' || line[i] == '\n') {
            break;
        }
        if (part == 0)
                method[j] = line[i];
        else if (part == 1)
                target[j] = line[i];
        else if (part == 2)
                version[j] = line[i];
        j++;
    }
    printf("method: '%s', target: '%s', version: '%s'\n", method, target, version);

    ...

}

我在这里分配和写入这个内存的方式有什么问题可以解释这些额外字符是如何附加的吗?

1 个答案:

答案 0 :(得分:2)

您必须通过添加空字符来终止字符串。

在这种情况下,使用calloc()是一种简单的方法。

char* method = malloc(LimitRequestLine + 1);
char* target = malloc(LimitRequestLine + 1);
char* version = malloc(LimitRequestLine + 1);

应该是

char* method = calloc(LimitRequestLine + 1, sizeof(char));
char* target = calloc(LimitRequestLine + 1, sizeof(char));
char* version = calloc(LimitRequestLine + 1, sizeof(char));