内存分区

//栈的特性
/*
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编辑  收藏  举报

导航