这段代码的目的是什么?

时间:2012-02-09 12:19:43

标签: c

#include <stdio.h>
#include <stdlib.h>
#define MAX 10
void main()
{
int *ptr, *arr[MAX];
int i, j;
for (i=MAX-1; i>=0; i--)

if (arr[i]=(int*)malloc(i*sizeof(int)))  // <= that line!

for (j=0; j<i; j++)
*(*(arr+i)+j) = j*i;

ptr = *(arr+MAX-1);
while (*ptr)    
printf ("%d ", *ptr--);
}

我不明白这个命令的目的是什么:

arr[i]=(int*)malloc(i*sizeof(int))

我知道这个malloc动态分配。 但arr [i]的含义是什么呢? 感谢。

5 个答案:

答案 0 :(得分:2)

您正在讨论的命令会分配一个长度块,该块足以存储i类型int项,并将结果存储在i个位置。名为arr的指针数组。该程序创建一个“三角形”arr数组:它的元素是不同长度的数组,按arr[i]可以容纳i元素的顺序排列。

顺便说一句,此代码缺少对free调用已分配的项目。

答案 1 :(得分:1)

int *ptr, *arr[MAX]

创建一个指向int的指针和一个包含指向int的指针的MAX元素的数组。

arr[i]=(int*)malloc(i*sizeof(int))

为每个int指针为i整数分配空间。

答案 2 :(得分:1)

首先sizeof()“返回”(在编译期间应该用数值替换)提供的类型的大小。意味着4 int(8个64b机器),1个char等等。

因此i*sizeof(int)表示i ints的大小(i = 4; sizeof( int) = 4;而不是16)。

malloc()使用要分配的字节数作为参数,因此malloc(16)分配16字节,足够的空间用于4个4B整数。

(int*)就像 C-hack 一样具有正确的类型(因为你想将那些16B用作int[4]而不是void *)。< / p>

整个代码意味着在第i个数组位置为i int分配空间(首先是1,第二个是2)。但是,当你尝试分配0字节时,我会徘徊0会发生什么:)

答案 3 :(得分:0)

它正在分配越来越长的数组作为arr的每个元素。所以arr [0]指向0大小的数组,arr [2]指向2个整数的数组,依此类推。

答案 4 :(得分:0)

arr是指向int的指针数组。它的每个元素 - arr[x] - 都是指向int的指针,因此是一个数组。它是一组内联数组。

对于数组的每个元素,您将创建一个大小为当前索引的数组。

请注意,您的代码是非法的,因为i==0时,您会调用malloc(0)

此外,最好不要强制转换malloc的返回类型。