C语言内存分配详解12


{

int *p1=NULL;

int *p2=NULL;

int rt;

p1=malloc(sizeof(int)*10);

if(p1==NULL)

exit(1);

p2=malloc(sizeof(int)*10);

if(p2==NULL)

exit(1);

memset(p1,'a',sizeof(int)*10);

memset(p2,'b',sizeof(int)*10);

rt=memcmp(p1,p2,sizeof(int)*10);

if(rt>0)

printf("p1>p2);

if(rt==0)

printf("p1=p2");

free(p1);

free(p2);

}

www.fosvos.com

4.2 内存分配

1、C中内存分为四个区

栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自

动释放。

堆:用来存放由动态分配函数(如malloc)分配的空间。是由自己手动分配的,并且必

须由使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内

存泄露。

全局局:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。

文字常量区:例如char *c = "123456";则"123456"为文字常量,存放于文字常量区。也

由编译器控制分配和释放。

程序代码区:用来存放程序的二进制代码。

例子(一)

int a = 0; //全局区

void main()

{

int b; //栈

char s[] = abc; //s在栈,abc在文字常量区

char *p1,*p2; //栈

char *p3 = 123456; //123456在常量区,p3在栈上

static int c =0; //全局区

p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆

p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆

strcpy(p1, 123456); //123456放在常量区

}

例子(二)

//返回char型指针

char *f()

{

//s数组存放于栈上

char s[4] = {‘1′,'2′,'3′,'0'};

return s; //返回s数组的地址,但程序运行完s数组就被释放了

}

void main()

{

char *s;

s = f();

printf (%s, s); //打印出来。因为s所指向地址已经没有数据

}

2、动态分配释放内存

用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。

内存分配成功后要对内存单元进行初始化。

内存分配成功且初始化后使用时别越界了。

内存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍

然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后面继续使用这块内存,应在

free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。

NO.1

void GetMemory(char *p)

{

p = (char *)malloc(100);

}

void Test(void)

{

char *str = NULL;

GetMemory(str);

strcpy(str,hello world);

printf(str);

}

请问运行Test函数后会是什么样的结果?

NO.2

char *GetMemory(void)

{

char p[] = hello world;

retrun p;

}

void Test(void)

{

char *str = NULL;

str = GetMemory();

printf(str);

}

同NO.1

NO.3

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《C语言内存分配详解12
本文地址:https://www.zhiletu.com/archives-656.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微