Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2675651
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5921
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: C/C++

2014-12-30 15:07:54

C语言学习笔记(19跨函数使用内存)

1、静态变量不能跨函数使用内存

  1. /* 
  2. 此代码是错误的,目的是为了演示静态变量不能跨函数使用 
  3. 静态内存由系统分配,当函数执行完毕由系统自动释放 
  4. */  
  5. # include   
  6. # include   
  7. void f(int ** q)  
  8. {  
  9.     /*q是指针变量,无论是什么类型的指针变量都只占4个字节 
  10.      q=&p。q存放了p的地址 
  11.      q存放的是int *类型的变量地址,q变量的类型是int **,*q的类型是int *。 
  12.      p存放的是int类型的变量地址,p变量的类型是int *,*P的类型是int。 
  13.      *q等价于p, p可以存放int类型变量的地址 
  14.     */  
  15.     int i=5;  
  16.     *q=&i;//等价于p=&i  
  17. }  
  18. int main (void )  
  19. {  
  20.     int * p;  
  21.     f(&p);  
  22.     /* f函数中的q变量和i变量的空间都是由系统分配的静态内存空间 
  23.         属于静态变量,当f函数执行完毕后,系统自动释放 
  24.         q和i所占用的内存空间,所以下面一行语句将无法访问 
  25.         其数据。 
  26.     */  
  27.     printf("%d", *p);//本语句语法上没有问题,但逻辑上有问题  
  28.     system("pause");  
  29.     return 0;  
  30. }  

2、动态内存可以跨函数使用内存


  1. /* 
  2.  动态内存由程序员手动分配,手动释放 
  3. */  
  4. #include   
  5. #include   
  6. #include   
  7.   
  8. void f(int ** q)//q存放int *类型变量的地址  
  9. {  
  10.     //sizeof(数据类型)返回的是该数据类型所占的字节数。  
  11.     //此处最好不要写成4,因为不同的机器它的数据类型所占的字节数有可能不相同  
  12.     *q=(int *) malloc(sizeof(int));//等价于p=(int *) malloc(sizeof(int));  
  13.     //q=5;//error  
  14.     //*q=5;//error p=5  
  15.     **q=5;//*p=5  
  16.   
  17.   
  18. }  
  19. int main(void)  
  20. {  
  21.     int * p;//p存放int *类型变量的地址  
  22.     f(&p);  
  23.     printf("%d\n",*p);  
  24.     system("pause");  
  25.     return 0;  
  26. }  
阅读(502) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~