使用malloc作为双指针

时间:2018-12-13 01:23:15

标签: c pointers

char **three = (char**)malloc(sizeof(char*));

char**,使用char指针类型。 char**表示我正在取消引用char指针。至于sizeof(char*),我使用的是char指针的大小,即8字节。

我误会了吗?

2 个答案:

答案 0 :(得分:2)

让我们看看能否将其分解:

char **three = (char**)malloc(sizeof(char*));
[     1    ][5][  4   ][ 3  ] [    2      ]
  1. 创建类型为three的变量char **,它是指向char *(在C语言中通常为“字符串”)的指针。
  2. 使用char*的大小传递到malloc
  3. 使用malloc分配那么多字节。
  4. 将返回值从mallocvoid*)转换为char**
  5. 将该值分配给three

因此,就我认为您的误解所在:

  • 请勿在C中强制转换mallocrealloc的返回值。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位)时,代码仍然可以正常编译。