所以我有几个函数可以与string
我创建的类型一起使用。其中之一创建了一个动态分配的字符串。另一个接受所述字符串,并扩展它。最后一个释放字符串。注意:函数名称已更改,但都是我自定义的。
string new = make("Hello, ");
adds(new, "everyone");
free(new);
上面的代码有效 - 它编译并运行良好。下面的代码不起作用 - 它编译、运行,然后
string new = make("Hello, ");
adds(new, "everyone!");
free(new);
代码之间的区别在于该adds()
函数增加了 1 个字符 (a !
)。它添加的字符没有区别 - 只是长度。为了完整起见,以下代码不起作用:
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
是我在其中的程序的极具描述性的名称。)
就函数内部而言,mymake()
是一个调用strlen()
和两个调用malloc()
和一个调用memcpy()
,myadds()
是一个调用strlen()
、一个调用realloc()
和一个调用memcpy()
,而 myfree()
是对标准库的两个调用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;
}