为了说明,可以声明C中的二维指针数组int* x[][4]
,其中第一个索引可以在运行时修复它是动态的然后可以说动态一维数组的动态声明可以是通过将第二个索引替换为值{1 int*[][1]
以及二维数组动态二维数组int*[][][1]
来实现calloc()
malloc()
内部使用它们是我的逻辑完全正确,这适用于在C语言程序
答案 0 :(得分:1)
为了说明,C中的二维指针数组如
int* x[][4]
可以宣布
仅在两种情况下:
当x
的初始化程序隐式传达第一维的值时,
int* x[][4] = { {NULL, NULL, NULL, NULL}, {NULL, NULL, NULL, NULL} };
作为函数参数的类型。在这种情况下,它完全等同于声明参数具有类型int *(*)[4]
:指向指向int
的四个指针的数组的指针。 如果实际给出了第一个维度,那也就是这种情况。
void foo(int* x[][4]);
,其中第一个索引可以在运行时修复
在上面的情况(1)中,否,第一个维度在编译时确定。
在上面的情况(2)中,不完全是。然后是声明指向1D数组的指针。这样的指针可以指向int *
的2D数组的第一个元素,并且可以将其编入索引,就像它实际上指定了这样的2D数组一样。第一个维度的大小不是传送,但如果指针实际上指向一个对象,那么该维度已修复用于函数的目的,无论是指向对象是否动态分配。
是的 动态然后我可以说动态声明动态 通过替换,可以在某种程度上实现一维数组 值为1的第二个索引,如int * [] [1]
该更改产生静态不同类型(在那些完全有效的上下文中)。在情况(2)中,但不是情况(1),这种类型和我们之前讨论的类型都可以指向动态分配的对象,但它们也可以指向适当类型的自动或静态持续时间对象。那里没有任何内在的动态。
和二维数组 int * [] [] [1]
的动态二维数组
没有。甚至不是函数参数的类型。最多可以省略(一个)前导维度。
calloc()malloc() 在内部使用它们
完全没有。他们怎么样?分配函数根本看不到此数据类型。您只需要分配多少空间,可以是单个复合值(malloc
),也可以是(元素数,元素大小)对(calloc
)。因此调用者需要知道需要多少内存。在任何情况下,这仅适用于情况(2)。情况(1)固有地产生静态或自动分配,而不是动态分配。
我的逻辑是正确的
没有
这适用于此 在一个简单的情况下使用动态数组声明 C语言程序中的函数
既不是函数的局部变量(案例1),也不是函数参数(案例2)。