代码是
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”?
答案 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 ++中可能会有所不同。