指向char数组的指针的内存分配

时间:2018-09-05 07:43:32

标签: c

请有人解释一下

的区别
char *names[3] 

char (*names)[3] 

以及如何读取此运算符?
如果我想为他们动态分配内存该怎么办?

对于第一种情况,我认为它只是长度为3的char*的数组,因此没有不适用的内存分配。但是在第二种情况下如何进行内存分配?

5 个答案:

答案 0 :(得分:3)

遇到类似问题时,通常可以转到cdecl(在线版本here):

cdecl> explain char *names[3]
declare names as array 3 of pointer to char

cdecl> explain char (*names)[3]
declare names as pointer to array 3 of char

因此前者创建了三个指向字符的指针的数组:

+----------+
| names[0] | -> char
|      [1] | -> char
|      [2] | -> char
+----------+

后者将创建一个单个指针,该指针指向大小为3的char数组。

+-------+
| names | -> char, char, char - no, not a dance step :-)
+-------+

答案 1 :(得分:1)

第二行decodes as“将名称声明为指向char数组3的指针”。

我写C已有25年以上了,我从未使用过这样的变量。

无论如何,我想这应该可行:

char data[3];
char (*names) = data;

请注意,变量名称names极易引起误解,因为变量仅包含3个单个字符,而char *names[3]则是三个指向字符的指针,因此很容易用来容纳三个字符字符串。

还要注意,上面的代码没有什么意义,如果有,您可以直接使用data

答案 2 :(得分:1)

第一个数组包含三个指向char的指针。

第二个是指向三个char的数组的指针。
(将其读取为“ *nameschar[3]”)。

您可以通过获取三个char的数组的地址来创建这样的指针:

char name[3];
char (*names)[3] = &name;

或以常规方式动态地

char (*names)[3] = malloc(sizeof(*names)); /* or sizeof(char[3]), if you're fond of bugs */

或通过常规的数组到指针转换:

char stuff[2][3] = {};
char (*names)[3] = stuff; /* Same as &stuff[0], as normal. */ 

答案 3 :(得分:1)

  • char *names[3]是3个char指针的数组。
  • char (*names)[3]是指向3个字符的数组char[3]的数组指针(指向数组的指针)。

所以这两个有根本不同的含义!不要将它们彼此混淆。

如果您希望分配指针数组,则可以按照以下任一示例进行操作:

char** names = malloc(3 * sizeof(*names) );
char** names = malloc(sizeof(char*[3]));
char** names = calloc(3, sizeof(char*));

这些都是等效的(但calloc还将所有指针设置为NULL)。 names将是指向数组中第一个元素的指针。它将是指向char*的指针。

如果要分配数组并指向第一个元素,只需执行以下操作:

char* names = malloc(3 * sizeof(*names));

或者,您可以使用数组指针语法并指向整个数组:

char (*names)[3] = malloc(sizeof(*names));

答案 4 :(得分:1)

  

以及如何读取此运算符?

让我们选择第二个,因为它是两者中较复杂的一个:

char (*names)[3]; 

当您查看这样一个复杂的定义时,最好的攻击方法是从中间开始并逐步解决。 “从中间开始”表示从变量名names开始。
“解决问题”是指向右看最近的项(在这种情况下,什么都没有;右括号会使您简短),然后向左看(以星号表示的指针),然后向右看( 3的数组,然后向左看(char)。
此左右左右运动适用于大多数声明。

这意味着names是一个指向大小为3的char数组的指针。 这是一个很奇怪的声明,但是就是这样读的。

  

如果我想为他们动态分配内存,怎么办?

现在您知道了声明的含义,内存分配变得很容易:

char (*names)[3] = malloc(3 * sizeof(char));