c-具有数组指针的动态内存分配



如何为数组的指针动态分配内存?(*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:
    T *p = malloc( N * sizeof *p );
    p[i] = ...;
    free( p );
    的1D阵列
  • 分配和使用T:
    T (*p)[N] = malloc ( M * sizeof *p );
    p[i][j] = ...;
    free( p );
    的2D阵列
  • 分配和使用T:
    T (*p)[M][N] = malloc (K * sizeof *p );
    p[i][j][k] = ...;
    free( p );
    的3D阵列

高维阵列的模式应该是清晰的。

相关内容

  • 没有找到相关文章