string
strlen(a)——获取数组a的长度,注意这是有效长度哦,就是说没有将字符串结束符算进去。
所以for(i=0;i<strlen(a);i++}printf("%c",a[i]);就可以将数组a都输出啦=0多了一个但<strlen没有取=又少了一个因此得到了平衡。
- for(int i=m;i<=strlen(t);i++)注意,这里是等于,为什么呢,因为这里是从m(非0)开始,m为一个具体的数,这里没有多0,所以有=;
- 注意上述是从第m+1个数开始的哦,因为0也是一个数,所以当数组下标为m时实际是第m+1个元素
数组长度问题
我在思考能不能定义一个可输入的变量为数组长度,如下代码:
scanf("%d",&m)
int a[m];
报错:
[Error] variable-sized object 'a' may not be initialized——[错误] 可变大小的对象“a”可能未初始化
琢磨:
我寻思着反正m会输入,那么我把定义语句写在输入后面a数组长度不就确定了嘛,接下来我们插入以下内存分配的方式:
插入内存分配:
1.静态存储区分配
由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与静态变量(包括静态全局和静态局部变量)。
2.栈上分配(动态内存分配)
同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将被自动释放。
(需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。)
3.从堆上分配(动态内存分配)
也称为动态分配内存,由程序员手动完成申请和释放。程序在运行的时,由程序员使用内存分配函数(如malloc函数)来申请内存,使用完之后再由程序员自己负责使用内存释放函数(如free函数)来释放内存。
(需要注意的是,如果在堆上分配了内存空间,就必须即使释放它,否则将会导致运行的程序出现内存泄漏等错误)
在c语言中,不同类型变量的存储位置和作用域也有所不同
————————————————原文链接:https://blog.csdn.net/u010547141/article/details/103407991
总结
由上述解释我们就可以知道:由编译器自动分配和释放,在程序编译的时候就已经分配好内存;
在编译时就已经要分好内存 ,而我们输入m是在编译运行后,因此在编译时m仍为变量,不是固定值!!!所以不可以如此哦