1

我有以下功能:

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. alloca()每个编译器都不支持使用(不是 ANSI C)
  3. malloc()函数外部的指针并将该指针传递给函数,然后将free()其传递给函数外部
  4. 将返回的指针分配给一个变量并释放该变量

这是选项 #4 的代码:

char *var;
var = malloc(MAX);
var = decrypt("Hello", 1);
free(var);

当我为它分配一个返回的指针时,我是否必须给malloc()该变量var,因为该指针已经被malloc()编辑了?

我的问题是:

在函数内部使用的最佳方法是malloc()什么?

malloc()如果我选择第 4 个选项,在将返回的指针分配给变量之前,我是否必须对其进行赋值?

4

4 回答 4

3

它应该是:

char *var = decrypt(whatever);
// ...use var...
free(var);

我不知道您为什么要使用代码示例预先泄漏一些内存。

您预先分配内存并让函数填充它的计划 (3) 也是可行的,但它会产生更冗长的代码,因为它引入了函数导致缓冲区溢出的可能性。

alloca将不起作用,因为该空间在函数返回时被释放。

于 2015-02-22T21:16:05.913 回答
2

您可以修改decrypt函数的签名,以便它提供函数写入结果的指针。

void decrypt(char* dest, const char *p, int key);

这样,调用者完全有责任管理这个内存空间。

于 2015-02-22T21:17:33.613 回答
0

问:在函数中使用 malloc() 的最佳方式是什么?

A:如果你真的想在函数内部分配内存(就像现在一样),你必须在这个函数之外释放内存(也许与其他补充函数)。有时人们对这些函数使用特殊名称(例如decrypt_ma(),代替decrypt())来记住内存分配的事实。

问:如果我使用第 4 种方式,我是否必须在分配返回的指针之前对该变量进行 malloc() ?

A:如果你在调用decrypt(),之前分配内存,decrypt()根本不应该返回指针(你将做的所有操作p都不应该const在函数体中)。

于 2015-02-22T21:17:46.373 回答
0

一个简单的替代方法是就地修改字符串:

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 字节数组编写更简单、更高效的实现。

于 2015-02-22T21:40:02.480 回答