内存分区
//栈的特性
/*
void test(){
int d=0;
int e=0;
}
int main(int argc, const char * argv[])
{
//栈区:特性先进后出(后进先出)
int a=10;//1
int b=10;//2
int c=10;//3
//创建顺序:1,2,3
//销毁顺序:3,2,1(输入叫做进栈,销毁叫做出栈)
//每一个函数都有一个栈帧
test();
int f=10;
//函数中的变量一旦函数执行完成,就被销毁
//队列:先进先出
return 0;
}
*/
/*
char *test1(){
char str[]="hello,would";//不可以将函数中栈区的地址返回,因为该地址中的内容会随着函数的结束而销毁
return str;
}
int main(int argc, const char * argv[])
{ char *p= test1();
printf("%s",p);
return 0;
}
*/
/*
char *test2(){
char *p="hello world";
return p;
}
int main(int argc, const char * argv[])
{
char *p=test2();
printf("%s",p);
return 0;
}
*/
//堆区:程序员手动分配的内存,并且需要程序员手动销毁(有几个专门的内存函数),特点:一旦分配,不管在什么地方,只要没有手动销毁,他都一直存在,直到程序结束.
//常量区:我们编写的程序中,所有的常量,都会被放在常量区,常量区的内容也是直到程序结束为止
//静态区:放的是全局变量(所有大括号外面的变量)和static标注的变量
/*
int main(int argc, const char * argv[])
{
for(int i=0;i<3;i++){
static int count=0; //这句话只被执行一次 ,被static标注的变量可以不赋初值,默认为0
count++;
printf("%d\n",count);
}
return 0;
}
*/
//代码区:我们编写的代码被编译器翻译之后,全部存入代码区
//*************************************************************************************************
/*
typedef struct student {
char name[20];
int age;
int sourec;
}student;
int main(int argc, const char * argv[])
{
*/
//malloc堆内存分配
//按照字节分配
//分配好的空间使用什么类型的指针指向它他就是什么类型
/*
int *p=malloc(4); //用指针接收所分配字节的地址,用指针存储起来
*p=10;
printf("%d",*p);
char *s=malloc(100);
strcpy(s,"大家好,我很😊");
printf("%s",s);
*/
//使用sizeof计算类型大小
/*student *p=malloc(sizeof(student)*20);
p[0].sourec=90;
p[0].age=25;
strcpy(p[0].name,"小a");
printf("%d",p[0].sourec);
printf("%s",p[1].name);
free(p);//释放内存 ,告诉系统,这块空间不归我管,但不是全部清空数据
p=NULL;//注意:释放完空间后,将指针置空
*/
//有⼀字符串,其中包含数字,提取其中的数字.要求动态分配内存保存
/*
int main(int argc, const char * argv[])
{
char str[]="yuc5a5252ij55iang";
int count=0;
for(int i=0;str[i]!='\0';i++){
if(('0'<=str[i])&&(str[i]<='9')){
count++;
}
}char *p=malloc(count+1);
int index=0;
for(int i=0;str[i]!='\0';i++){
if(('0'<=str[i])&&(str[i]<='9')){
p[index]=str[i];
index++;
}
}
p[index]='\0';
printf("%s",p);
free(p);
p=NULL;
return 0;
}
*/
//输⼊3个学员的姓名,动态分配内存保存学员姓名,并在最后输出
/*
int main(int argc, const char * argv[])
{
char *names[3]={0};
for(int i=0;i<3;i++){
char *p=malloc(20);
printf("请输入字符串:");
scanf("%s",p);
names[i]=p;
}
for(int i=0;i<3;i++){
printf("%s\n",names[i]);
}
//内存释放
for(int i=3;i<3;i++){
free(names[i]);
names[i]=NULL;
}
return 0;
}
*/
//calloc
/*
int main(int argc, const char * argv[])
{
int *p= calloc (2,sizeof(int));//分配n个连续空间
p[0]=10;
p[1]=20;
free(p);
// free(p);//过度释放,释放一次就可以了
p=NULL;
*/
//int main(int argc, const char * argv[])
//{
// //realloc函数
// /* int *p =malloc(12);
// p[0]=10;
// p[1]=20;
// p[3]=30;
// p=realloc(p,24);//括号里面是需要改内存的指针地址,24表示需要改成多大的
// p[3]=40;
// printf("%d",p[3]);
// free(p);
// */
//
//
//
// //内存初始化
//
// char *p=malloc(10);
// p=memset(p,5,10);
//
// // printf("%d %d",p[0],p[9]);
//
//
//
// //内存拷贝
// char *q=malloc(10);
// q=memcpy(q,p,10);
// // printf("%d",q[0]);
// q[0]=10;
// // free(p);
// // free(q);
// // p=NULL;
// // q=NULL;
//
// //内存比较
// int i=memcmp(p,q,10);
// printf("%d",i);
//
// 定义两个整型指针,分别⽤用malloc、calloc对其分配空间保存3个元 素,malloc分配的空间⽤用memset清零,随机对数组进⾏赋值随机范围1-3,赋值后⽤用memcmp⽐比较两个数组。如果相同打印Good!否则 打印Failed...
/*
int *p=malloc(sizeof(int)*3);
int *p1=calloc(3,sizeof(int)*3);
p=memset(p,0,sizeof(int)*3);
for(int i=0;i<3;i++)
{p[i]=arc4random()%(3-1+1)+1;
p1[i]=arc4random()%(3-1+1)+1;
printf("%d\t",p[i]);
printf("%d\n",p1[i]);
}
int i=memcmp(p,p1,sizeof(int)*3);
if(i==0){
printf("good");
}else
{
printf("feiled");
}
free(p);
free(p1);
p=NULL;
p1=NULL;
return 0;
posted on 2015-07-24 11:58 yucaijiang 阅读(198) 评论(0) 编辑 收藏 举报