【问题标题】:Creating pointer-to-pointer using malloc使用 malloc 创建指针到指针
【发布时间】:2009-10-06 10:46:25
【问题描述】:

代码是

char** p = (char **) malloc(sizeof(char **) * size); //Where size is some valid value.
p[1] = (char*) malloc(sizeof(char) * 30);

上面的代码可以吗?

我的理解是

p -> +---------+
     0 char*   + -> {c,o,d,e,\0}
     +---------+

     +---------+
     1 char*   + -> {t,o,a,d,\0} //The assignment of these values is not shown in the code.
     +---------+

所以我们应该改写

char** p = (char **) malloc(sizeof(char *) * size);

我说的对吗?

并且 p[0] 表示 *(p + 1) 其中 p+1 将指向“toad”,因此将返回“toad”?

【问题讨论】:

  • 您已标记此 C++,但您使用的是 C 表示法。如果你真的在使用 C++,那么你应该使用 new[] 而不是 malloc,否则,将其重新标记为 C。

标签: c pointers


【解决方案1】:

作为一般规则,您在 malloc 调用中获取大小的“*-ness”应该比接收 malloc 内存的指针小 1 个“*”。

例如:

char * p = malloc(sizeof(char) * somesize);

char ** p = malloc(sizeof(char *) * somesize);

【讨论】:

    【解决方案2】:

    是的,你基本上在这里分配了一个 char* 数组,大小为size。确实应该使用sizeof(char *) 而不是sizeof(char **),但实际上它不会改变任何东西,因为指针始终是相同的大小。

    p[0] 表示 *p,我假设您的意思是 p[1] 表示 *(p + 1),这是正确的。

    【讨论】:

    • 对不起,我的错。我本来想写 p[1] 但写了 p[0]。
    【解决方案3】:

    是和不是。您是正确的,第一次分配应该使用sizeof( char * ),但是由于指针和指向指针的指针具有相同的大小,所以没关系。

    但是p[0] 指向保存“code”的缓冲区,而p[1] 指向保存“toad”的缓冲区。代码分配一个指针数组,然后填充数组的第二个元素,而第一个元素未初始化。

    【讨论】:

      【解决方案4】:

      是的,您应该 malloc() sizeof(char*) 因为您打算将 char* 存储在数组中。

      在大多数情况下,sizeof(char **) 将等于 sizeof(char *),因此初始代码也可以工作,但您真的不应该依赖它 - 它不是绝对可移植的,这样的代码会令人困惑。

      p[0] 表示*(p + 0),而不是(*p + 1)p[1] 表示*(p + 1)

      【讨论】:

        【解决方案5】:

        你是对的。应该是

        char** p = (char**) malloc(sizeof(char*) * size);
        

        至于你的最后一个问题,我不太明白。 p[0] 表示 *(p+0)。 p[1] 表示 *(p+1)。

        【讨论】:

          【解决方案6】:

          是的,你应该写

          char** p = (char **) malloc(sizeof(char *) * size);
          

          但不是,p[0] 表示 *(p + 0),其中 p+0 将指向 "code",因此将返回 "code"

          如果要“蟾蜍”,请使用p[1],即*(p + 1)

          【讨论】:

            【解决方案7】:

            我总是这样:

            #include <stdlib.h>
            pointer = malloc(ELEMENTS * sizeof *pointer);
            /* check if pointer is NULL */
            

            你的情况变成:

            #include <stdlib.h>
            char** p = malloc(sizeof *p * size); //Where size is some valid value.
            /* check if p is NULL */
            p[1] = malloc(sizeof *(p[1]) * 30);
            /* check if p[1] is NULL */
            

            注意:在C语言中,malloc的返回值不应该被强制转换! void * 完全可以分配给任何其他指针类型。 在 C++ 中可能会有所不同。

            【讨论】:

              猜你喜欢
              • 2012-04-29
              • 2017-03-10
              • 1970-01-01
              • 1970-01-01
              • 2017-05-13
              • 1970-01-01
              • 2012-08-17
              • 2011-02-19
              • 1970-01-01
              相关资源
              最近更新 更多