私は次の機能を持っています:
char * decrypt(const char *p, int key) {
char *tmp = malloc(strlen(p) + 1);
for (int i = 0; p[i] != '\0'; i++) {
if (p[i] >= 'A' && p[i] <= 'Z') {
if (key <= p[i] - 'A')
tmp[i] = p[i] - key;
else
tmp[i] = p[i] - key + 'Z' - 'A' + 1;
} else if (p[i] >= 'a' && p[i] <= 'z') {
if (key <= p[i] - 'a')
tmp[i] = p[i] - key;
else
tmp[i] = p[i] - key + 'Z' - 'A' + 1;
}
}
return tmp;
}
私は一時的なポインタ*temp
にメモリを割り当てています:
char *tmp = malloc(strlen(p) + 1);
しかし、私はそれをどこにも解放していません。
私の知る限り、そのメモリを解放するには 4 つのオプションがあります。
- 同じスコープで使用
free()
します(ポインターを返さなければならないため、私には不可能です) alloca()
すべてのコンパイラでサポートされていない使用(ANSI C ではない)malloc()
関数の外側のポインターとそのポインターを関数に渡し、次に関数の外側に渡しfree()
ます- 返されたポインタを変数に割り当て、その変数を解放する
これはオプション #4 のコードです。
char *var;
var = malloc(MAX);
var = decrypt("Hello", 1);
free(var);
そのポインターは既に編集されているため、返されたポインターを割り当てるときにmalloc()
変数を使用する必要がありますか?var
malloc()
私の質問は次のとおりです。
malloc()
関数内で使用する最良の方法は何ですか?
4 番目のオプションを使用するmalloc()
場合、返されたポインターを割り当てる前に変数を使用する必要がありますか?