【问题标题】:Calling malloc and storing return value in double pointer?调用 malloc 并将返回值存储在双指针中?
【发布时间】:2019-04-09 22:46:02
【问题描述】:
char **init(int n) {
    char **result;
    result = malloc(n * sizeof(char));
    return result;
}

我需要帮助了解第 3 行是否是错误。对 malloc() 的调用将在堆上的内存上创建 N 个连续块,每个块都足够大以存储单个字符,并且它将返回一个 void ptr(数组的基地址)。但是,result 是一个指向指针的指针,所以它需要存储另一个指针的地址,这不是这里的情况?

【问题讨论】:

  • 为什么结果是指向指针的指针?
  • @merlin2011 如果你在方法中看到我们声明变量 result 是一个双指针,它是一个指向指针的指针。
  • 这可能是一个错误,但我不明白你的推理。
  • @aDabOfRanch,将result 声明为char** 意味着result 在语法上是char**,但这并不意味着它在语义上是char**malloc 的返回值是一个线性内存块,而不是一个指针数组。
  • 一次调用malloc 会创建一个连续的存储块

标签: c string pointers


【解决方案1】:

也许你想做这样的事情:

char *init(unsigned int n) {
    char *result;

    /* allocate the memory */
    result = malloc(n * sizeof(char));

    return result;
}

这将分配内存来存储 n 个连续字符。

您可以将代码简化为:

char *init(int n) {
    return malloc(n * sizeof(char));
}

或者您可以直接执行以下操作,而不是调用此函数:

malloc(n * sizeof(char));

或者你可以创建一个宏

#define INIT_CHAR_ARR(n) malloc((n) * sizeof(char))

如果你想要 n 个连续的字符指针:

malloc(n * sizeof(char*))

如果您解释了您的最终目标,这将对我们有所帮助,也许有更好的方法来做您正在做的事情。

【讨论】:

  • sizeof (char) 定义为 1
  • 感谢您的信息。在使用malloc() 时,最好使用sizeof() 来明确说明返回值的用途以及我们分配该字节数的原因。 malloc(n) 对程序员的信息比 malloc(n*sizeof(char)) 少,后者有助于解释我们将其用作 n 个字符的数组。
  • 我强烈反对。如果将其包装在宏(或函数)中,则名称已经提供了该信息。如果你直接调用 malloc 来初始化一个变量,你可以只做char *result = malloc(n * sizeof *result); (不管result 的类型都是正确的)。在这两种情况下,您都不需要写sizeof (char)
  • 有很多方法可以做到这一点,使用sizeof() 是两者的关键。我生活在嵌入式系统世界中,在sizeof() 中编写数据类型而不是变量名(可能与严格跟踪内存有关)是非常标准的,但只要你保持一致,任何东西都可以工作
猜你喜欢
  • 2015-07-20
  • 2014-10-27
  • 2016-07-08
  • 2014-09-25
  • 1970-01-01
  • 2018-04-08
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多