2013-03-20 1 views
0

Я хочу собрать какой-то HTTP-заголовок (это просто забавный проект, который я делаю). Но моя проблема больше о о том, как сделать это в C. У меня есть функция, как это:Сборка строки c и возврат ее по ссылке (с использованием функций malloc и string.h)

void assembleResponse(char **response, const unsigned short code, const unsigned long length, const char *contentType) 
{ 
    char *status; 
    char *server = {"Server: httpdtest\r\n"}; 
    char *content = malloc(17 + strlen(contentType)); 
    char *connection = {"Connection: close"}; 

    printf("AA"); 

    strcpy(content, "Content-type: "); 
    strcat(content, contentType); 
    strcat(content, "\r\n"); 

    printf("BB"); 

    switch (code) 
    { 
    case 200: 
     //200 Ok 
     status = malloc(sizeof(char) * 18); 
     //snprintf(status, 17, "HTTP/1.1 200 Ok\r\n"); 
     strcpy(status, "HTTP/1.1 200 Ok\r\n"); 
     break; 
    } 

    printf("CC"); 

    unsigned int len = 0; 
    len += strlen(status); 
    len += strlen(server); 
    len += strlen(content); 
    len += strlen(connection); 

    printf("DD"); 

    response = malloc(sizeof(char) * (len + 5)); 
    strcpy(*response, status); 
    strcat(*response, server); 
    strcat(*response, content); 
    strcat(*response, connection); 
    strcat(*response, "\r\n\r\n"); 

    printf("EE"); 
} 

И где-то в основном я хочу, чтобы сделать ответ так:

char *resp; 
assembleResponse(&resp, 200, 500, "text/html"); 
printf("assembled response: %s", resp); 

Но я не совсем туда :) Там, похоже, много проблем о том, как Im выделяет строки и вставляет в них контент. Я добираюсь до флага «BB», но далее получаю:

malloc: *** error for object 0x104b10e88: incorrect checksum for freed object - object was probably modified after being freed. 

Что я делаю неправильно и как его исправить? Я familiar с malloc и C-like функциями, но явно не экспертом с ними.

Спасибо!

ответ

5

Проблемы, кажется, здесь:

response = malloc(sizeof(char) * (len + 5)); 

В этом случае выделяет массив char* с неправильным размером.

Вы должны сделать:

*response = malloc(sizeof(char) * (len + 5)); 

для того, чтобы выделить массив char.