#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]的含义是什么呢? 感谢。
答案 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
的返回类型。