使用数组指针的动态内存分配

时间:2014-02-12 13:17:54

标签: c arrays pointers malloc

如何为数组指针动态分配内存? (*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 *'|

3 个答案:

答案 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 );

高维数组的模式应该清晰。