malloc 分配出来的 int* 指针,完全能用 [] 下标访问。
示例代码
#include <stdio.h> #include <stdlib.h> int main() { // 分配能存放5个int的内存 int *arr = (int *)malloc(5 * sizeof(int)); if(arr == NULL) { perror("malloc fail"); return 1; } // 用[]赋值、读取 arr[0] = 10; arr[1] = 20; arr[2] = 30; for(int i = 0; i < 5; i++) { printf("%d ", arr[i]); } free(arr); // 用完一定要释放! return 0; }arr[i] 等价于 *(arr + i)
arr 是指向这块连续内存首地址的指针,指针加减偏移, [] 只是语法糖。
总结
1. malloc分配的是连续内存,所以下标访问合法;
2. 下标不能越界!比如分配5个int,不能访问 arr[5] ;
3. int* arr 只是指针,不是数组类型,不能用 sizeof(arr) 获取数组总大小(得到的是指针大小);
4. 用完必须 free(arr) ,防止内存泄漏。
int a[5]; // 栈上数组,数组类型 int *p = malloc(5*sizeof(int)); // 堆上,指针类型 a[0]; // ✔ p[0]; // ✔ 完全一样拓展:二维(malloc)
int **p = malloc(3 * sizeof(int*)); for(int i=0;i<3;i++) p[i] = malloc(4 * sizeof(int)); p[1][2] = 100; // 同样可以[]访问