c语言中,分配的什么是静态数组组,如何释放内存

一:什么是静态内存什么又是动态内存呢?
静态内存:是指在程序开始运行时由编译器分配的内存,它的分配是在程序开始编译时完成的,不占用CPU资源。程序中的各种变量,在编译时系统已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间所以变量的分配与释放,都无须程序员自行考虑。
动态内存:指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。
1.下面通过一个例子来认识一下静态内存分配
#include&stdio.h&
#include&stdlib.h&
静态内存分配
void function(int** point) {
int i = 100;
*point = &i;
function(&point);
printf("*point=%d\n",*point);
printf("*point=%d\n",*point);
system("pause");
从打印结果看以看出,第一次打印的时候成功的改变了point的值当我们第二次打印得到的值却是0。原因其实很简单,执行function()函数的改变了point的值。当function()函数执行完毕的时候系统将函数内的变量回收掉了也就不存在了,i的地址就不存在了所以*point指向i的地址也就没有了。
2.动态内存分配(堆分配)
#include&stdio.h&
#include&stdlib.h&
动态内存分配
void function(int** point) {
int* temp = malloc(sizeof(int));
int i =100;
function(&point);
printf("*point=%d\n",*point);
printf("*point=%d\n",*point);
system("pause");
在function()函数中通过malloc(内存大小);函数向系统在堆内存中申请一块空间;返回一个地址值 。当function()函数执行完毕的时候*temp指针变量在堆内存中所以不会被回收,所以*point指向的地址依旧存在。
上面我门手动申请的temp内存,系统不会帮我们回收那么问题来了,当不需要的时候怎么回收这个垃圾呢?
想要回收一个垃圾的时候可以调用free函数即可将内存释放 &&free(变量);
二:动态创建一个数组,动态扩展数组长度
int* arr = malloc(3);
arr = realloc(arr,3);
1.看个小案例就大概知道这两个函数的意思了
动态创建数组
printf("请输入数组的长度:\n");
int length;
scanf("%d",&length);
printf("输入数组的长度为:%d\n",length);
//动态申请一块内存,int占4个字节
int* arr = malloc(length * 4);
for(i=0; i&length; i++) {
printf("输入arr[%d]的值:",i);
scanf("%d",arr+i);
//让用户扩展数组的长度
printf("请输入扩展数组的长度:\n");
int superL
scanf("%d",&superLength);
//对数组的内存进行重新分配 realloc(需重新分配内存的变量, 大小);
arr = realloc(arr,(length + superLength) * 4);
for(i=length; i&length + superL i++) {
printf("输入arr[%d]的值:",i);
scanf("%d",arr+i);
//将数组的内容打印出来
for(i=0; i&length + superL i++) {
printf("arr[%d]的值=%d\n",i,*(arr + i));
//使docs窗口停留
system("pause");
来看下程序运行效果
三:静态内存相当于Java中一个函数内的变量,执行方法的时候开辟一块空间方法执行完毕的时候由Jvm进行回收;动态内存就相当于我们Test test = new Test();test所占的内存就是动态内存。
扫码向博主提问
非学,无以致疑;非问,无以广识
擅长领域:
ReactNativ
微信小程序
JNI的使用,例子:android内存释放和填充
android jni malloc和free的使用
android jni new/delete 和 new[]/delete[]
动态内存的赋值和修改(Android之JNI)
Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统
没有更多推荐了,写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误。下面贴上一些示例代码,以供参考。
如果要给二维数组(m*n)分配空间,代码可以写成下面:
// 先分配m个指针单元,注意是指针单元
// 所以每个单元的大小是sizeof(char *)
a = (char **)malloc(m * sizeof(char *));
// 再分配n个字符单元,
// 上面的m个指针单元指向这n个字符单元首地址
for(i = 0; i & i++)
a[i] = (char *)malloc(n * sizeof(char));
(注意红色部分)
释放应该是:
for(i=0;i&m;i++)
free((void *)a[i]);
free((void *)a);
如果为三维数组(m*n*p)分配空间呢,应该是:
char ***a, i,
a = (char ***)malloc(m * sizeof(char **));
for(i = 0; i & ++i)
a[i] = (char **)malloc(n * sizeof(char *));
for(i = 0; i & ++i)
for(j = 0; j & ++j)
a[i][j] = (char *)malloc(p * sizeof(char));
释放代码为逆过程,具体代码为:
for(i = 0; i & ++i)
for(j = 0; j & ++j)
free((void *)a[i][j]);
for(i = 0; i & ++i)
free((void *)a[i]);
free((void *)a);
三维以上的多维数组的分配和释放,原理与上面的一样。
C中如何为第二维长度固定的二维数组分配内存
在所写的代码中,有时需要为一个二维数组分配内存,该二维数组的第一维长度不定,而第二维是固定(类似arr[n][3]的数组)。我们可以想到的是用双指针代替数组,当然可以;也可以直接对n赋值后,直接定义arr[n][3](C99标准支持),但这里要说的是另一种方法。
这里以将点云数据读入二维数组为例,由于点云点数n不定,可以确定的是,点是三维点,可以用以下方式定义并分配内存:
double (*arr)[3] = malloc (n*3*sizeof(double));
但在VC编译环境下,将会报错——无法从“void *”转换为“double (*)[3]”,此时应该在malloc函数之前进行类型转换,应该如何转换呢?怎样转换才能成double (*)[3]类型呢,可以进行如下转换:
double (*arr)[3] = (double ((*)[3]))malloc (n*3*sizeof(double));
搞定!:)。
C语言系列(五)内存的分配与释放
C/C++动态二维数组的内存分配和释放 .
数组内存申请和释放,指针数组和数组指针
指针malloc分配空间与数组区别
二维指针malloc和free
没有更多推荐了,【请高手进】C语言指针数组如何动态分配内存?【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:587,290贴子:
【请高手进】C语言指针数组如何动态分配内存?收藏
我写了一个可以分割任意长度字符串的函数,分割符号可以指定,我这里就用空格测试了。没有做多个空格的处理。参数说明:char *str[]
//保存分割好的二维字符数组int *plenStr
//保存分割好的二维数组的行数char *test //要分割的字符串int lenTest //要分割的字符串的长度char ge//分割符号
代码:#include&stdio.h&#include&stdlib.h&#include&string.h&int main( void ){
void division( char *str[], int *plenStr, char *test, int lenTest, char ge );//分割任意长度的字符串char *test = "This is a C program Hello World";//测试字符串 int lenTest = strlen( test );
const char ge = ' ';//判别符
char *str[15];//指针数组
int lenStr = 0;//二维数组的行数
int *plenStr = &lenS
int i = 0;division( str, plenStr, test, lenTest, ge );
if( NULL == str )
printf("失败!\n");
printf("成功!\n");
for( i = 0; i & lenS i++ )
printf("str[%d] = %s\n",i,*( str + i ));
printf("\n\nMy Hello World!\n");
return 0;}//分割任意长度的字符串void division( char *str[], int *plenStr, char *test, int lenTest, char ge ){
int numGe = 0;//判别符数量 int *GeArray = NULL;//判别符位置数组 char *temp = NULL; int lenT char *p = (char*)malloc(sizeof(char) * ( lenTest + 3 ) ); *( p ) =//第一个位置增加判别符号 for( i = 0,j = 1; i & lenT i++,j++ ) {
*( p + j ) = *( test + i ); } *( p + j ) =//最后一个位置增加判别符*( p + j + 1 ) = '\0';//人为设置字符串结束符
for( i = 0; i & strlen(p); i++ )//遍历判别符{
if( ge == *( p + i )){
numGe++; } } GeArray = (int*)malloc( sizeof(int) * numGe);//保存判别符位置的数组for( i = 0,j = 0; i & ( lenTest + 3 ); i++ ) { if( ge == *( p + i ) )
{ *( GeArray + j ) = j++; } } for( i = 0, n = 0;i & numGe - 1;i++, n++ ) { lenTemp = *( GeArray + i + 1 ) - *( GeArray + i );temp = (char*)malloc(sizeof(char) * lenTemp );//分配每一个字符串的空间 j = 0; for( k = *( GeArray + i ) + 1; k & *( GeArray + i + 1 ); k++ )
{*( temp + j ) = *( p + k );
*( temp + j ) = '\0';
*( str + n ) =
} *plenStr =//二维字符数组的维数}
登录百度帐号【C语言求助】如何释放字符数组剩余的无用空间?【c语言吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:587,290贴子:
【C语言求助】如何释放字符数组剩余的无用空间?收藏
比如,我要输入一个字符串,保存在字符数组中,但是我们事先并不知道要输入的字符串的长度,我们就设置足够大的数组空间,比如Char a【50】,但是实际上可能我们输入的字符长度只有20,剩下的a【21】---a【50】完全就是没有使用的空间,C语言函数库里面有没有类似于释放数组空间的函数?
我不是伸手党额= =在我们的教材书上找了很多都没有找到解决办法,&&& 倒是看到一个free()函数可以释放内存空间,但是不知道怎么用- -求达人指教……小弟万分感激
教材书上这么写的:calloc函数用于为具有N个元素的一维数组动态分配存储空间,每个元素长度为size个字节……但是后面的实例中它还是事先给N 设定了初始值,这不等于没有分配一样嘛……
静态分配用不扭曲的手法是不能〔释放〕的,因为根本就没有〔申请〕……
回复:3楼还有,区分下〔分配〕和〔操作〕
回复:5楼其实我是想完成这样一个操作:从键盘输入一串数字到一个int型数组中,但是我并不知道事先要输入几个数字,可能很多;之后经过一些过程,最后要用printf函数输出这个数组中的所有数字,该怎么做?用指针可以完成吗?
啊啊~~我懂了,先用malloc申请,再用free()释放……
我空间的/* * c.c * *
Created on:
Author: zhangqijun */#include&stdio.h&#include&stdlib.h&int main(){&&
int i=0,j=0,k=0,flag=1;&&
/**dynamic*/&&
ch=(char *)malloc(1*sizeof(char));&&&
/** whatever you input ,this can input the Array --&ch[]*/&&
while(flag)&&
ch[i]=getchar();&&
if(ch[i]=='\n')&&
ch=(char *)realloc(ch,1*sizeof(char));&&
printf("String length:%d\n",k);&&
puts("String input:");&&
for(j=0;j&k;j++)&&
printf("%c
",ch[j]);&&
return 0;}
其实可以强制覆盖
热插拔内存条最简便了````
那是string.h
其实变长缓冲区也是个经典话题了,毕竟每天都在用……
如果蛋疼的话可以用类似std::vector的动态增长的方式
Try alloca?
其实挂成链或者环,限定下最大长度,这样也可以吧……具体尺寸看读写速率了
用链式就不太好。。那个很慢
只是形状而已,限定最大长度的话用顺序存储就ok链式的话得配合内存池了……
If it doesn't escape, using alloca seems to be a good idea.
登录百度帐号当前位置: >>
C语言中多维数组的内存分配和释放(malloc与free)=
C 语言中多维数组的内存分配和释放(malloc 与 free)的方法 写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误。下面贴上一 些示例代码,以供参考。 如果要给二维数组(m*n)分配空间,代码可以写成下面: 复制代码 代码如下:char **a, // 先分配 m 个指针单元,注意是指针单元 // 所以每个单元的大小是 sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配 n 个字符单元, // 上面的 m 个指针单元指向这 n 个字符单元首地址 for(i = 0; i & i++) a[i] = (char * )malloc(n * sizeof(char )); 释放应该是: 复制代码 代码如下: for(i=0;i&m;i++) free((void *)a[i]); free((void *)a); 如果为三维数组(m*n*p)分配空间呢,应该是: 复制代码 代码如下:char ***a, i, a = (char ***) malloc(m * sizeof(char ** )); for(i = 0; i & ++i) a[i] = (char **) malloc(n * sizeof(char * )); for(i = 0; i & ++i) for(j = 0; j & ++j) a[i][j] = (char * )malloc(p * sizeof(char )); 释放代码为逆过程,具体代码为: 复制代码 代码如下:int i,j,; for(i = 0; i & ++i) for(j = 0; j & ++j) free((void *)a[i][j]); for(i = 0; i & ++i) free((void *)a[i]); free((void *)a);三维以上的多维数组的分配和释放,原理与上面的一样。
C语言使用realloc对malloc的内存重新分配_计算机软件及应用_IT/计算机_专业资料。...(i=0;i&2;i++) free(let[i]);//循环释放 int *n=(int *)malloc(...一:new delete 是运算符,malloc,free 是函数 malloc 与 free 是 C++/C 语言的标准库函数,new/delete 是 C++的运算符。它们都可用于申请 动态内存和释放内存。...C语言:malloc()函数与alloc()函数_计算机软件及应用_IT/计算机_专业资料。C ...然后再分配空间.free 时,释放的内存并不立即返回给 os,而是 保留在内部结构中...C语言 - Static 堆heap栈stack的区别: Stack/heap/static(存储区) 内存释放之后 malloc-&realloc申请内存 Free释放内存 链表 C语言优...数组的数组(即 C 语言中的二维数组) 蜕化为数组 的指针, 而不是指针的指针...答:多数 malloc/free 的实现并不把释放的内存返回操作系统, 而是留着供同一...free(p); } } if(n==3) {printf(&请输入插入位置(前一个学生号)&); scanf(&%d&,&xh); q=(struct xuesheng*)malloc(sizeof(struct xuesheng)); prin...C++中 new 和 delete 是对内存分配的运算符,取代了 C 中的 malloc 和 free。 标准 C++中的字符串类取代了 C 标准 C 函数库头文件中的字符数组处理函数。 ...#include &stdio.h& #include &malloc.h& //...(struct address_list *head); // 释放内存函数...{ q-&next=p-& free(p); printf(&删除...#include &stdio.h& #include &malloc.h& #...C 语言版 线性表的单链表存储结构表示和实现 P28-...{ q = p-& free( p ); //释放空间 p...C语言头插法举例_计算机软件及应用_IT/计算机_专业...&malloc.h& struct node /*创建链表结构*/ /*...(&\n&); top=p-& free(p); } } void...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。}

我要回帖

更多关于 动态数组和静态数组 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信