2016-02-27 71 views
0

我是C新手,第二次调用函数时出现意外值。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); 

    ... 

} 

是不是有什么毛病我分配和写入到这里该内存这可以解释这些多余的字符是如何追加的方式?

回答

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)); 
+0

或'memset的(方法,0,LimitRequestLine + 1)'等...每个'malloc'后 - 相同的原理。不得不承认,从未想过使用'calloc'作为替代方案。 – isedev

+0

'calloc()'会将所有分配的字节初始化为0,这是不必要的,使程序变慢。 –

+0

太棒了,让它工作。非常感谢! – Subbeh