使用malloc创建指向指针的指针

时间:2009-10-06 10:46:26

标签: c pointers

代码是

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”?

7 个答案:

答案 0 :(得分:8)

作为一般规则,你接受malloc调用内部大小的'* -ness'应该比接收malloc内存的指针小1'*'。

例如:

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

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

答案 1 :(得分:2)

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

在大多数情况下,sizeof(char **)将等于sizeof(char *),因此初始代码也会起作用,但你真的不应该依赖它 - 它不是绝对可移植的,而且这样的代码很混乱。

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

答案 2 :(得分:2)

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

p [0]表示* p,我认为你的意思是p [1]表示*(p + 1),这是正确的。

答案 3 :(得分:2)

是和否。你是正确的,第一个分配应该使用sizeof( char * ),但由于指针和指针指针具有相同的大小,因此无关紧要。

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

答案 4 :(得分:1)

你是对的。它应该是

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

关于你的上一个问题,我不太关注。 p [0]表示*(p + 0)。 p [1]表示*(p + 1)。

答案 5 :(得分:1)

是的,你应该写

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

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

如果您想要“toad”,请使用p[1],即*(p + 1)

答案 6 :(得分:1)

我总是这样做:

#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 ++中可能会有所不同。