内存分配以及指针处理的相关测试代码

#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;
}

posted @ 2015-11-05 19:20  cloudren2020  阅读(81)  评论(0编辑  收藏  举报