kar*_*t18 3 c arrays malloc pointers
这里考虑以下代码示例:
int *a = malloc(sizeof(int) * n);
Run Code Online (Sandbox Code Playgroud)
这段代码可以用来定义一个包含n个整数的数组吗?
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调用如何创建可访问的数组.)
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实际上是一个指针。