码迷,mamicode.com
首页 > 其他好文 > 详细

c进阶1(堆,栈,静态区,代码区)

时间:2015-04-07 15:26:59      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

一、内存四大区域

1.栈

先进后出

栈的大小固定,默认1M,可以编译的时候设置,超出则溢出

变量离开作用范围后,栈上的数据会自动释放

栈是连续的,向上增长

#include<stdio.h>
#include <stdlib.h>
void go();
void main()
{
    

    void *p1 = malloc(10); //p1,p2栈上
    void *p2 = malloc(20);
    //00A0F914, 00A0F908
    printf("%p,%p", &p1, &p2);//地址在栈上,向上增长
    //00A63CD8, 00A67A50
    printf("\n%p,%p", p1, p2);//堆区,向下增长
    getchar();
}

  函数参数的压栈顺序是从右向左

    int a=4;
    //参数压栈的顺序从右向左
    printf("%d,%d", a, ++a);//5,5

 

2.堆

     堆上内存需要手动申请手动释放,由程序控制,malloc申请,free释放

  堆是链接的,向下增长,连续的存取速度快于链接

3.如何选择栈还是堆?

数据占用内存大小是否明确   

手动管理还是自动管理

4.静态区

  存放全局变量/常量,静态变量/常量

  全局变量

    全局变量和函数声明可以有多个

    可以跨文件使用

  静态变量

    与程序共存亡,编译的时候就初始化,只会初始化一次

    只能在当前c文件中使用

5.代码区

  程序代码指令、常量字符串,只可读

二、用数组实现栈

#include <stdio.h>
#include <stdlib.h>
//判断栈是否为空
int isempty();
//设置栈为空
void setempty();
//进栈
int push(int num);
//出栈
int pop();
#define N 5
struct stack
{
    int top;//栈顶
    int data[N];//存放数据
};
//栈的初始化
struct stack mystack = { -1, { 0 } };

void main()
{
    int num[5] = {1,2,3,4,5};
    for (int i = 0; i < 5; i++)
    {
        push(num[i]);
    }
    while (!isempty())
    {
        printf("%d",pop());
    }
    getchar();
}


//判断栈是否为空
int isempty()
{
    if (mystack.top != -1)
    {
        return 0;//0表示不为空
    }
    return 1;//1代表空
}
//设置栈为空
void setempty()
{
    if (isempty())
    {
        mystack.top = -1;
    }
}
//进栈
int push(int num)
{
    if (mystack.top == N - 1)
    {
        return -1;
    }
    else
    {
        mystack.top += 1;
        mystack.data[mystack.top] = num;
        return 1;
    }
}
//出栈
int pop()
{
    int num=-1;
    if (!isempty())
    {
        num= mystack.data[mystack.top];
        mystack.top -= 1;
    }
    return num;
}

三、递归判断数组是否递减

  方式一

int isDec(int num[],int len)
{
    if (len==1)
    {
        return 1;
    }
    else
    { 
        if (num[len-1]<num[len-2])
        {
            return isDec(num, len - 1);
        }
        else
        {
            return -1;
        }
        
    }
}

  技术分享

  方式二

//n必须是0
int
isDec(int num[],int len,int n) { if (n==len-2) { return num[n] > num[n + 1]; } else { return (num[n] > num[n + 1]) && isDec(num,len,n+1); } }

 

 

技术分享

c进阶1(堆,栈,静态区,代码区)

标签:

原文地址:http://www.cnblogs.com/ginb/p/4398304.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!