malloc()可以用来定义数组的大小吗?

kar*_*t18 3 c arrays malloc pointers

这里考虑以下代码示例:

int *a = malloc(sizeof(int) * n);
Run Code Online (Sandbox Code Playgroud)

这段代码可以用来定义一个包含n个整数的数组吗?

Kei*_*son 7

int *a = malloc(sizeof(int) * n);
Run Code Online (Sandbox Code Playgroud)

这段代码可以用来定义一个包含n个整数的数组吗?

这取决于"定义数组"的含义.

声明如下:

int arr[10];
Run Code Online (Sandbox Code Playgroud)

定义一个命名的数组对象.你的指针声明和初始化没有.

但是,malloc调用(如果成功并返回非NULL结果,如果 n > 0)将在运行时创建匿名数组对象.

但它并没有"定义一个数组a". a指针对象的名称.鉴于malloc调用成功,a将指向数组对象的初始元素,但它本身不是数组.

请注意,由于数组对象是匿名的,因此无法应用sizeof任何内容,也无法从指针中检索数组对象的大小.如果您需要知道阵列的大小,您需要自己跟踪它.

(一些注释表明malloc调用分配的内存可以容纳n整数对象,但不包含数组.如果是这种情况,那么你将无法访问创建的数组对象的元素.参见N1570 6.5.6p8用于定义指针添加,7.22.3p1用于描述malloc调用如何创建可访问的数组.)


P.P*_*.P. 5

int *a = malloc(sizeof(int) * n);
Run Code Online (Sandbox Code Playgroud)

假设malloc()调用成功,您可以使用数组符号(例如)将指针a 数组一样使用a[0] = 5;。但是a它本身不是数组。它只是指向的指针int(可能是可以存储多个ints 的内存块)。

你的评论

但是我可以在程序中使用数组a,而无需声明

建议这就是您主要要问的问题。

用C语言

p[i] == *(p + i) == *(i + p) == i[p]
Run Code Online (Sandbox Code Playgroud)

只要i或是p指针类型之一(p也可以是数组-可以在任何表达式中将其转换为指针)。因此,您可以a像访问数组一样进行索引。但是a实际上是一个指针。