关注公众号[不会编程的程序圆],看更多干货
对你有帮助,请不吝点个赞,点关注不迷路
初识 动态内存分配 [C语言必知必会]
动态内存分配的引入
初学数组的时候,有一个问题经常困扰着我,就是:我们可不可以自己在程序里定义一个数组的大小而不是在函数开头先声明一个很大的数组,然后仅仅使用它的一小部分?
请看下面的程序:
我们需要一个大小为 N ( N < 1000)的数组,我们通常这么写:
int main(void) {
int arr[1000] = {
0 };
int N = 0;
int i = 0;
printf("请输入数组的大小\n");
scanf("%d", &N);
printf("请输入%d个数\n", N);
for (i = 0; i < N; i++)
scanf("%d", &arr[i]);
return 0;
}
每次这么写我都觉得自己在绕远路,为什么就不能直接把输入的变量 N 当作数组的大小直接使用?
比如这样:arr[N]
,但是很遗憾,每次编译器都把你扼杀在程序编译之前!
C99才可以用变量做数组定义的大小
并且可以在程序中随时声明变量。(C99前我们需要在函数的最前面的区域对所有变量进行声明)
如果我不想用上面那种笨笨的办法,又没有支持C99的编译器,我该怎么办?
可以这么做:
int* arr = (int*)malloc(sizeof(int) * N)
sizeof(int)
代表数组中每个元素的类型
N
代表数组的元素个数
所以malloc的意义是向 堆区 要了一块sizeof(int) * N
这么大的空间
malloc 与 free ——好哥俩
malloc
头文件:
stdlib
原型:void* malloc(size_t size)