内存分配以及指针处理的相关测试代码
2015-11-05 19:19
405 查看
#include<stdio.h> #include<stdlib.h> #include<assert.h> void GetStr(char *p) { p="123456";//指向一个全局数据区 字符串常量 int a=10;//栈区 static int b=10;//全局静态区 char *q=(char*)malloc(12);//堆区 char *r=(char*)malloc(12);//堆区 printf("addr p=%p a=%p b=%p q=%p r=%p\n",p,&a,&b,q,r);//全局数据区{p,b} 栈区{a} 堆区{q,r} free(q);//释放指针内存空间 free(r); q=NULL;//防止野指针 r=NULL; } char *GetStr2(void) {//数组 char p[]="123456";//栈内存数据 return p;//这里强调不要用 return 语句返回指向“栈内存”的指针,因为该内存在函数结束时自动消亡 结果这里出现警告! } void test() { char *p=NULL; p=(char*)malloc(12); GetStr(p); printf("======\n\np=%p\n",p);//堆区 p=GetStr2();//出错!! //printf("%s\n",p); assert(p!=NULL); printf("%s\n",p); free(p); p=NULL; } char *GetStr3() { char *p="123456"; return p; } void test2(void) { char *str =NULL; printf("addr str=%p\n",str);//str地址之后发生了变化 str = GetStr3(); printf("addr str=%p\n",str); printf("%s\n",str) ;//GetStr3 设计无效 随时调用都可以 /*GetStr3 内的“123456”是常量字符串,位于静态存储区,它在程序生命期内 *恒定不变。无论什么时候调用 GetString2,它返回的始终是同一个“只读”的内存块。 */ } int main() { //test(); test2(); return 0; }
相关文章推荐
- java面向对象8
- [C++11] 顺序存储的完全二叉树构造树形结构
- C# 引用ref/out
- java面向对象7
- java面向对象6
- java面向对象4
- PHP实现投镖求PI法,最笨但最有意思
- [C++11] 二叉树的实现
- java面向对象3
- opencv + numpy for python
- java面向对象2
- java面向对象
- metasploit渗透测试笔记(内网渗透篇)
- 黑马程序员——高新技术----枚举及部分JDK新特性
- C#习题之一元二次方程
- C语言解析.XML文件
- 指针数组与数组指针------C++学习笔记
- Django的单元测试
- django-crontab定时任务
- C#数组详细解释