繁体   English   中英

函数内部malloc的C用法

[英]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种释放内存的选项:

  1. 在相同的范围内使用free() (这对我来说是不可能的,因为我必须返回指针)
  2. 使用并非所有编译器(不是ANSI C)都支持的alloca()
  3. malloc()函数外的指针,并将该指针传递给函数,然后在函数外将free()给函数
  4. 将返回的指针分配给变量并释放该变量

这是选项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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM