char **three = (char**)malloc(sizeof(char*));
char**
,使用char指针类型。 char**
表示我正在取消引用char指针。至于sizeof(char*)
,我使用的是char
指针的大小,即8字节。
我误会了吗?
答案 0 :(得分:2)
让我们看看能否将其分解:
char **three = (char**)malloc(sizeof(char*));
[ 1 ][5][ 4 ][ 3 ] [ 2 ]
three
的变量char **
,它是指向char *
(在C语言中通常为“字符串”)的指针。char*
的大小传递到malloc
。malloc
分配那么多字节。malloc
(void*
)转换为char**
。three
。因此,就我认为您的误解所在:
malloc
或realloc
的返回值。C完全能够将void*
隐式转换为其他指针类型,并且明确地执行此操作可以隐藏某些细微的错误。 char*
变量数组,并且该数组大小为1。因此,缺少在某个时刻对其调用realloc
的情况,它的使用受到了限制(除非您需要它来生存当前的作用域,否则您最好使用局部变量而不是分配的单元素数组) 。答案 1 :(得分:2)
代码如下:
char **three = ( char** )malloc( sizeof( char* ) );
分配一个指向char的指针数组,但只有一个元素。变量three
是指向char的指针。与以下内容大致相同:
char *three[1];
通常(如@paxdiablo所指出的),分配多个指针将更为常见:
int line_count = 66;
char **three = ( char** )malloc( line_count * sizeof( char* ) );
一旦分配,就可以与数组符号一起使用:
three[0] = "The Owl and the Pussy-cat went to sea";
three[1] = "In a beautiful pea-green boat,";
three[2] = "They took some honey, and plenty of money,";
three[3] = "Wrapped up in a five-pound note."
char**
并没有什么特别之处,每个C / C ++程序都可以像argv
一样获得一个。
作为一名程序员,您真的不知道指针为 8 个字节,而是知道指针的大小为 some 个。这就是sizeof( char* )
的来源。在编译期间,编译器将其与实际值交换。这样,当体系结构为16位,32位或64位(或将来可能为128位)时,代码仍然可以正常编译。