С вопросом выделения памяти

Итак, у меня есть пара функций, которые работают с string типа, которую я создал. Один из них создает динамически выделяемый жало. Другой берет сказал строку и расширяет ее. И последний освобождает строки. Примечание: функция имена изменены, но все пользовательские мной.

string new = make("Hello, ");
adds(new, "everyone");
free(new);

приведенный выше код работает - компилируется и работает нормально. Приведенный ниже код не работает - компилируется, запускается, а затем

string new = make("Hello, ");
adds(new, "everyone!");
free(new);

разница между кода в том, что adds() функция добавления 1 и более символов (!). Символ, он добавляет никакой разницы - только длина. Просто для полноты картины, следующий код не работает:

string new = make("Hello, ");
adds(new, "everyone");
adds(new, "!");
free(new);

как ни Странно, следующий код, который использует различные функции, addc() (который добавляет 1 знак вместо строки) работы:

string new = make("Hello, ");
adds(new, "everyone");
addc(new, '!');
free(new);

В следующем, которая также делает то же самое, работает:

string new = make("Hello, everyone!");
free(new);

ошибка, что все те, которые не работают дать это:

test(526) malloc: *** error for object 0x100130: double free
*** set a breakpoint in malloc_error_break to debug

(test - это очень описательные названия программы я это имеете в.)

что касается функции внутренних органов, мой make() - это вызов strlen() и два вызова malloc() и вызовом memcpy(), adds() - это вызов strlen()вызов realloc(), и вызов memcpy(), и free() - два вызова стандартной библиотеки free().

Итак, есть какие-нибудь идеи, почему я получаю это, или мне нужно, чтобы сломать и использовать отладчик? Я только во все это с adds()Эс в течение определенного периода, а не с addc().

Ломая и разноски код функций:

typedef struct _str {
  int _len;
  char *_str;
} *string;

string make(char *c)
{
    string s = malloc(sizeof(string));
    if(s == NULL) return NULL;
    s->_len = strlen(c);
    s->_str = malloc(s->_len + 1);
    if(s->_str == NULL) 
      {     
        free(s);
        return NULL;
      }
    memcpy(s->_str, c, s->_len);
    return s;
}

int adds(string s, char *c)
{
    int l = strlen(c);
    char *tmp;
    if(l <= 0) return -1;
    tmp = realloc(s->_str, s->_len + l + 1);
    if(!tmp) return 0;
    memcpy(s->_str + s->_len, c, l);
    s->_len += l;
    s->_str[s->_len] = 0;
    return s->_len;
}

void myfree(string s)
{
    if(s->_str) free(s->_str);
    free(s);
    s = NULL;
    return;
}

Найдено 6 ответов:

C memory allocation question

http://stackoverflow.com/questions/648907/c-memory-allocation-question

Посмотреть решение →