[英]C usage of malloc inside a function
我有以下功能:
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()
) malloc()
函数外的指针,并将该指针传递给函数,然后在函数外将free()
给函数 这是选项4的代码:
char *var;
var = malloc(MAX);
var = decrypt("Hello", 1);
free(var);
当我为变量var
分配返回的指针时,是否必须malloc()
,因为该指针已经是malloc()
?
我的问题是:
在函数内使用malloc()
的最佳方法是什么?
如果我选择第四个选项,是否必须在分配变量返回的指针之前对它进行malloc()
处理?
它应该是:
char *var = decrypt(whatever);
// ...use var...
free(var);
我不知道您为什么要事先在代码示例中泄漏一些内存。
您预先分配内存并填充函数的计划(3)也是可行的,但是它使代码更加冗长,因为它引入了函数导致缓冲区溢出的可能性。
alloca
无法使用,因为函数返回时该空间已释放。
您可以修改decrypt
函数的签名,以便它提供函数写入结果的指针。
void decrypt(char* dest, const char *p, int key);
这样,调用者有全部责任管理此内存空间。
问:在函数内使用malloc()的最佳方法是什么?
答:如果您真的想在函数内部分配内存(如现在),则必须释放该函数之外的内存(也许与其他互补函数一起使用)。 有时人们对这些函数使用特殊的名称(例如, decrypt_ma()
而不是decrypt()
)来记住有关内存分配的事实。
问:如果我要使用第4种方法,在将返回的变量赋值为返回的指针之前,是否需要malloc()?
答:如果您在调用decrypt()
之前分配了内存,那么decrypt()
根本不应返回指针(您将使用p
进行所有操作,这些p
在函数体内不应为const
)。
一个简单的替代方法是在适当位置修改字符串:
void decrypt(char *p, int key) {
for (; *p; p++) {
if (*p >= 'A' && *p <= 'Z') {
if (key <= *p - 'A')
*p -= key;
else
*p += ('Z' - 'A' + 1) - key;
} else
if (*p >= 'a' && *p <= 'z') {
if (key <= *p - 'a')
*p -= key;
else
*p += ('Z' - 'A' + 1) - key;
}
}
}
请注意,您可以使用256字节数组编写更简单,更有效的实现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.