string
そのため、作成したタイプで機能する関数がいくつかあります。それらの 1 つは、動的に割り当てられた文字列を作成します。もう 1 つは、前述の文字列を受け取り、それを拡張します。そして最後のものは文字列を解放します。注: 関数名は変更されていますが、すべて私が独自に定義したものです。
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()
の 2 つの呼び出しと へmalloc()
の呼び出しmemcpy()
、 myadds()
は への呼び出し、 へstrlen()
の呼び出しrealloc()
、 への呼び出しmemcpy()
、 myfree()
は標準ライブラリへの 2 つの呼び出しfree()
です。
なぜ私がこれを取得しているのか、または分解してデバッガーを使用する必要があるのでしょうか? adds()
sではなく、特定の長さを超える es でのみ取得してい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;
}