TT最近在做数组的题目,就遇到了一个很烦人的问题:很多不给数组的长度,但是要我输入这个数组的值。也就是说,我都不知道这个数组要开多长,他却既要我输入数据,还要我保存输出和计算!(C99条件下的编译器完全不需要担心这个问题)
可怜的TT每次都是开一个[10000]的数组,有时候甚至还要更大,放在堆中~
可是今天,老师一语点醒梦中人呐!
正片开始
C99是允许变量定义数组长度的,就像这样
//C99
int main()
{int n = 0;scanf("%d", &n);int arr[n] = { 0 };return 0;
}
可是我的编译器【VS2022】却会变成这样
我猜测可能就是编译器不支持C99的原因(也可能是其他原因~)
那这样的话就只能使用C89的动态内存分配了
动态内存分配要使用malloc函数
头文件
#include<stdlib.h>
它的作用是像计算机申请一段空间的内存,而且可以使用变量
但是他的返回类型是void*,所以必须使用到另外一个运算符 强制类型转换()
上代码(简单版)
#include<stdio.h>
#include<stdlib.h>
int main()
{int n = 0;scanf("%d", &n);int* a = (int*)malloc(n * sizeof(int));//申请失败会返回NULL//此时就可以把a当做一个数组使用了for (int i = 0; i < n; i++){scanf("%d", &a[i]);//但是有个缺点,每输入一个数就要按一次enter键}for (int i = 0; i < n; i++){printf("%d ", a[i]);}free(a);//一定要freereturn 0;
}
使用malloc必须要注意的是,申请完必须要free,否则,程序不停止的话(比如服务器程序,一打开就不在停止运行),你的电脑可能撑不了多久。
问题来了
把printf拿上去一起循环的话就会显得这个程序很没用 【doge】)而且还变复杂了,很显然,它还有更大的用处。这要看你怎么使用这个厉害的函数了。要注意free一定要是原来的变量,所以我们一般不对原来的变量做计算。
不妨再看看下面一段代码。
#include<stdio.h>
#include<string.h>//strchr函数(寻找字符串中的特定字符,并返回对应指针)的头文件
int main()
{char arr[] = { "hello" };char* p = (char*)malloc(strlen(arr) + 1);//malloc的参数里面只需要表示大小的表达式,sizeof和strlen都可以做到//char* p = (char*)malloc(5*sizeof(int));//这样也可以,这里是字符串,所以就直接使用strlen了p = strchr(arr, 'l');printf("%s", p);return 0;
}
希望与诸君共勉~