c - 动态记忆

时间:2010-10-04 09:14:55

标签: c

大家好,首先感谢各位提供帮助。 现在我想知道双指针。我正在做这样的代码:

int main()
{
    int **a;
    a = (int*)malloc(sizeof(*int)*5);
    for (i=0;i<5;i++)
    {
        a[i] = malloc(sizeof(int)*3);
    }
}

现在我不知道我是否正确行事。如何在这种类型的数组中放置值?任何人都可以用例子解释这个概念吗?提前谢谢。

2 个答案:

答案 0 :(得分:4)

好吧,你已经分配了一个等价的数组:

int a[5][3];

所以输入值就是这样:

a[0][0] = 1234;

将值放入第一行的第一列和

a[4][2] = 9999;

会将另一个值放入最后一行的最后一列。

由于您使用的是malloc,因此您还应该从i = 0到4循环[i],free(a[i]);然后free(a);或者您的程序会泄漏内存。

答案 1 :(得分:3)

好吧......你在这里所拥有的基本上是一个指针指针,即一个地址的地址。处理数组时可以使用这种变量。

代码的前两行相当于:

int* a[5]; // Declaration of an array of 5 integer pointers (a[0] till a[4]).

“纯”C代码不使用变量作为数组的大小,因此当您想要动态编辑数组的大小时,可以使用malloc。

意思是,如果在您的代码中,您不打算更改数组的大小,那么您将使用一种非常复杂的方法来实现一个非常简单的目标。你可以输入:

int a[5][3];

但是如果你不知道你的数组的大小,你必须使用mallocs(然后,免费)。你在做什么,基本上是:

  • 声明一个数组数组;
  • 将x个POINTER的内存分配给整数数组;
  • 对于每个POINTERS,为y整数分配内存。

现在你已经完成了这个,你可以正常使用你的数组。例如:

a[1][0] = 1;

意味着:在第一个数组[1]中,第一行[0]为1。

与没有mallocs的上述标准声明的唯一区别在于,由于您分配了内存,因此您必须释放它。这就是为什么你不想丢失你的变量**。在函数结束时,指针到指针变量将被销毁,但不会销毁你分配的内存。