如何为数组指针动态分配内存?
(*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 *'|
答案 0 :(得分:0)
您正在将指向整数数组(您的声明)的指针与整数指针数组(赋值)混合。您可以将声明更改为:
int *p[4];
在这种情况下,您的作业将有效。或者,你可以简单地删除malloc,因为你的声明已经分配了四个整数。但是,如果您希望整数是自动的,那么如果声明是:
,代码将更具可读性int p[4];
因为那基本上是一回事。如果你想稍后指向一个整数数组的指针,你可以传入&amp; p。
答案 1 :(得分:0)
在你的声明int (*p)[4];
中,p
是指向int类型和4
长度数组的指针,但p
只是一个指向它的指针阵列。因此,您可以分配到(*p)[i]
。
需要*p
周围的括号,因为[]
运算符的precedence高于*
deference运算符。所以(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] = %d\n", 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] = %d\n", i, (*p)[i]);
}
return 1;
}
将其编译为:gcc -Wall -pedantic xx.c
检查代码是否正常工作@ codepad。
我建议你避免使用C语言中的malloc和calloc函数转换返回的地址,关于这个读取Do I cast the result of malloc?。
答案 2 :(得分:0)
如果您只是分配int
的4元素数组,则需要编写
int (*p)[4] = malloc( sizeof *p );
或
int (*p)[4];
...
p = malloc( sizeof *p );
由于p
的类型是“指向int
的4元素数组的指针”,因此表达式 *p
的类型为“4元素”数组int
“,因此sizeof *p
为我们提供了要分配的正确字节数(sizeof (int [4])
)。
您可以访问每个元素
(*p)[i] = x;
括号是必要的。请记住,表达式 *p
的类型是“int
的4元素数组”,因此我们要将[]
运算符应用于该结果表达。由于[]
的优先级高于一元*
,因此我们需要使用括号将*
运算符显式分组到p
。
您也可以写p[0][i] = x
,因为p[0]
与*p
同义。这消除了显式的取消引用,但它将p
视为2D数组,这可能会令人困惑。
由于这种混乱,这不是分配一维数组的常用方法;通常的做法是写
int *p = malloc( n * sizeof *p );
...
p[i] = x;
由于p
的类型是“指向int
的指针”,因此表达式*p
的类型只是int
,因此我们需要指定{的数量我们想要int
来电{1}}。由于malloc
是指向p
的简单指针,因此我们可以直接将下标运算符应用于它,而无需先取消引用它。
如果你要分配一个int
的Nx4元素数组,那你就写了
int
并且您将以
的形式访问每个元素int (*p)[4] = malloc ( N * sizeof *p );
由于表达式p[i][j] = x;
的类型是“指向p
的4元素数组的指针”,因此表达式int
的类型是“{4的{4}元素数组因此我们不需要明确地取消引用p[i]
。
所以,总结一下:
int
类型的单个元素:p
T
的一维数组: T *p = malloc( sizeof *p );
*p = ...;
free( p );
T
的二维数组: T *p = malloc( N * sizeof *p );
p[i] = ...;
free( p );
T
的3D数组: T (*p)[N] = malloc ( M * sizeof *p );
p[i][j] = ...;
free( p );
高维数组的模式应该清晰。