Итак, у меня есть несколько функций, которые работают с созданным мной типом string
. Один из них создает динамически распределенное жало. Другой принимает указанную строку и расширяет ее. И последний освобождает строку. Примечание. Имена функций изменяются, но все меня настраивают.C вопрос распределения памяти
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()
es на определенную длину, а не с addc()
s.
Ломая и размещения кода для функций:
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;
}
Нам понадобится код функций. Очевидно, что есть ошибка –
, вам нужно будет опубликовать код для добавлений(); –
в целом в стороне, лучше всего не называть что-то «новое» в C ... если вы когда-либо хотели скомпилировать его как C++, вам придется его изменить. Компиляция как C++ - хорошая идея, так как вы можете получать больше сообщений компилятора, которые по очереди делают для лучшего кода (при условии, что вы исправляете сообщения :-) – TofuBeer