如何为数组的指针动态分配内存?(*p)[4]
int main()
{
int (*p)[4];
int i;
for (i=0;i<4;i++)
(p)[i]=(int*)malloc(4);
printf("a");
return 0;
}
在code::blocks
上,它说:
error: incompatible types when assigning to type 'int[4]' from type 'int *'|
您将一个指向整数数组的指针(声明)与一个整数指针数组(赋值)混合在一起。您可以将申报单更改为:
int *p[4];
在这种情况下,你的作业就可以了。或者,您可以简单地删除malloc,因为您的声明已经分配了四个整数。然而,如果您希望整数是自动的,那么如果声明是:,代码将更可读
int p[4];
因为这基本上是一样的。你可以直接通过&p如果您稍后想要一个指向整数数组的指针。
在声明int (*p)[4];
中,p
是指向int类型和4
长度的数组的指针,但p
只是一个指针,它不指向任何数组。因此,您可以分配给(*p)[i]
。
注意*p
周围的括号是必需的,因为[]
运算符的优先级高于*
尊重运算符。所以(p)[i]
是非常错误的。
首先了解如何使用指向数组的指针检查以下示例:
#include<stdio.h>
int main(){
int b[4] = {1, 2, 3, 4};
int i;
int (*p)[4] = &b;
for(i = 0; i < 4; i++){
printf(" b[%d] = (*p)[%d] = %dn", i, i, (*p)[i]);
}
return 1;
}
输出:
b[0] = (*p)[0] = 1
b[1] = (*p)[1] = 2
b[2] = (*p)[2] = 3
b[3] = (*p)[3] = 4
检查工作代码@codepad。
现在,如何为p
指针使用动态内存分配?检查以下示例:
#include<stdio.h>
#include<stdlib.h>
int main(){
int i;
int (*p)[4];
p = malloc(4 * sizeof(int)); // allocation
// assignments
for(i = 0; i < 4; i++){
(*p)[i] = i * i;
}
for(i = 0; i < 4; i++){
printf(" (*p)[%d] = %dn", i, (*p)[i]);
}
return 1;
}
编译为:gcc -Wall -pedantic xx.c
检查代码working@codepad。
我建议您避免强制转换C中malloc和calloc函数的返回地址,关于这一点,请阅读Do I强制转换malloc的结果?。
如果您只是分配一个int
的4元素数组,那么您应该编写
int (*p)[4] = malloc( sizeof *p );
或
int (*p)[4];
...
p = malloc( sizeof *p );
由于p
的类型是"指向int
的4元素数组的指针",因此表达式*p
的类型为"int
的4元素阵列",因此sizeof *p
为我们提供了正确的字节数(sizeof (int [4])
)。
你可以作为访问每个元素
(*p)[i] = x;
括号是必要的。请记住,表达式*p
的类型是"int
的4元素数组",因此我们希望将[]
运算符应用于该表达式的结果。由于[]
的优先级高于一元*
,因此我们需要用括号将*
运算符显式分组为p
。
您也可以编写p[0][i] = x
,因为p[0]
是*p
的同义词。这消除了显式解引用,但它将p
视为2D数组,这可能会令人困惑。
由于这种混乱,这不是分配1D数组的常见方式;通常的做法是写
int *p = malloc( n * sizeof *p );
...
p[i] = x;
由于p
的类型是"指向int
的指针",因此表达式*p
的类型只是int
,因此我们需要在malloc
调用中指定所需的int
的数量。由于p
是指向int
的简单指针,我们可以直接将下标运算符应用于它,而不必首先取消引用它。
如果你正在分配一个int
的Nx4元素数组,你应该写
int (*p)[4] = malloc ( N * sizeof *p );
你可以作为访问每个元素
p[i][j] = x;
由于表达式p
的类型是"指向int
的4元素数组的指针",因此表达式p[i]
的类型为"int
的4元素阵列",因此我们不需要显式取消引用p
。
综上所述:
- 分配和使用类型为
T
:
的单个元素T *p = malloc( sizeof *p ); *p = ...; free( p );
- 分配和使用
T
:
的1D阵列T *p = malloc( N * sizeof *p ); p[i] = ...; free( p );
- 分配和使用
T
:
的2D阵列T (*p)[N] = malloc ( M * sizeof *p ); p[i][j] = ...; free( p );
- 分配和使用
T
:
的3D阵列T (*p)[M][N] = malloc (K * sizeof *p ); p[i][j][k] = ...; free( p );
高维阵列的模式应该是清晰的。