C语言静态内存释放的问题,请大神指教
首先这个数组不是静态数组,因为你没有写static关键字!所以这个数组是局部数组,进入函数时创建,函数结束时撤销。这个程序编译时一般会有警告——你返回了一个已撤销的数组的起始地址。
静态变量的静态:变量占用的存地址不释放,也就是说它的地址它从头到尾一内直占着,容不给其他内存单元占用而已,其本身的值是可以改变的。
指针未初始化就free失败 也就是一个指针没有成功执行malloc分配,就直接free肯定会失败,因为该指针还未经过初始化。
C语言动态数组的词目释义
C语言支持一维数组和多维数组。如果一个数组的所有元素都不是数组,那么该数组称为一维数组。在C语言中使用数组必须先进行定义,一维数组的定义方式为:类型说明符; 数组名 ;[常量表达式]。
动态数组的内存空间是从堆(heap)上分配(即动态分配)的。是通过执行代码而为其分配存储空间。当程序执行到这些语句时,才为其分配。程序员自己负责释放内存。
char *p;p=(char *)malloc(len+1);这样就申请了len+1个内存空间,并把第一个单元的地址强制为char *型指针赋给了char *型指针p。然后就可以像使用数组一样使用p了,如p[0]=3;等。
数组名是来存放数组的区域是一块在栈中静态分配的内存(非static),而数组名是这块内存的代表,它被定义为这块内存的首地址。这就说明了数组名是一个地址,而且,还是一个不可修改的常量,完整地说,就是一个地址常量。
c语言数组的定义
1、在C语言中使用数组必须先进行定义,一维数组的定义方式为:类型说明符; 数组名 ;[常量表达式]。其中,类型说明符是任一种基本数据类型或构造数据类型。
2、所谓数组,是有序的元素序列。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。这些无序排列的同类数据元素的集合称为数组。
3、C语言中,同变量一样;数组也必须先定义后使用。一维数组的定义形式:类型标识符 数组名[常量表达式];例如int a[10]; 其中a为地址常量。
C语言初始化数组时,一定要使用静态存储吗?
1、C语言规定只有 静态存储 (static)数组和外部存储(extern)数组才能初始化。
2、对于静态存储变量,声明时未赋初始值,缺省初始值为零。这当然是在编译阶段进行的。而对于动态存储变量,即非静态存储的局部变量,如果没有显式的初始化,则包含的是垃圾内容。
3、,4,5,6,7,8,9,10};/ 错误!/ 因为a是只有4个字节的指针,没有可用的存储空间给需要初始化的变量。所以,静态数组从语法上来说允许被初始化。作为程序员来说,你可以初始化静态数组,也可以不初始化,由你决定。
C语言静态数组
1、ANSI/ISO C之前,对数组的一次性初始化必须要求数组被声明为静态的,楼上说static和extern与变量的使用范围有关,没错,但不是这里要使用的含义,这里静态(全局变量默认为静态的)指的是该变量只初始化一次。
2、静态数组最多能开到2K字节,相当于1024个整数。malloc开辟的动态数组容量则与机器的内存总容量和当前占用的内存容量有关系。
3、关于数组定义在栈中维度大小受限,想要定义在堆中,可以用malloc申请。详细看我写的案例备注吧。
c语言静态存储数组的赋值问题。
1、int a[3];a[3] = { 2, 4 , 5 } 的,不管有没有static修饰。
2、因为a是只有4个字节的指针,没有可用的存储空间给需要初始化的变量。所以,静态数组从语法上来说允许被初始化。作为程序员来说,你可以初始化静态数组,也可以不初始化,由你决定。
3、…值}; 其中static表示是静态存储类型, C语言规定只有静态存储数组和外部存储数组才可作初始化赋值(有关静态存储,外部存储的概念在第五章中介绍)。在{ }中的各数据值即为各元素的初值, 各值之间用逗号间隔。