动态内存分配

来源:互联网 发布:log4j linux 日志路径 编辑:程序博客网 时间:2024/05/22 03:29

int main(int argc,constchar * argv[])//形参

{

//    凡是在函数内定义的变量,都存放在栈区域里,函数提里面的都是栈区

//    先进后出,先进去的人被后进的人堵住了,后面的先出去,先进的才能出去

    //先定义得变量先入栈,后定义的变量后入栈,

    //调用函数时,函数中的变量会陆续入栈,函数调用结束,变量陆续出栈;

    //栈区内存的分配与回收有系统自动进行;

//    int a=10;//a也是在栈区域里面

//    float b=1.5;//B也是在栈区域里

//    

//    char c='b';

//

//    //硬盘恢复 全局区=(静态区) 代码区 常量区       //SP

//    double d=3.14;

//    printf("%p %p %p %p\n",&a,&b,&c,&d);

 

    

 //指针

//    char *p="iphone";

//    *p='o';                  改常量必崩溃

    

//    char q[20]="iphone";        这个可以

//    q[0]='o';

    

    

    

    

//    sum(3,5);

//    printf("%d",sum);

    

    

    

 //静态储存区

 //编译开始h就进入内存了,程序运行期间h已经存在,不会被销毁,程序结束时,h才被销毁,如果没有给h赋值,系统默认初始值为0

    //定义在函数外面的变量,成为全局变量,全区变量和静态变量一样,存储在全局区(也叫静态区)

//    static int h=10;

    

    

    //堆区***

    // void *malloc(unsigned int size);   1byte=8bit,八位  2 bytes字节

    

//    char*str=malloc[8];

//    str在栈区表示地址,其他在堆区

    

    //molloc得主要功能是从堆区开辟指定大小的内存空间,

    //内存大小一字节为单位

    //返回值是这段空间的首地址;

    

//    int *p=malloc(4);

    

    //当内存满时()里的数字变小,结果不变,变大就会改变;

//    printf("%d ",*p);

//    *p=20;

//    printf("%d",*p);

    //int *p =malloc操作的是堆区。p存的地址是堆区地址

//    int a=10;

//    int *q=&a;

    //a在栈区,q也在栈区,qa得地址,也就是栈区地址。

//    *p=20;

//    short *p1=p;//malloc(4);

//    *p1=2;

//    *(p1+1)=3;

//    printf("%d %d %d",*p,p1[0],p1[1]);


    

//    typedef struct  student{

//        char name[20];

//        int age;

//        int num;

//        char sex;

//    }Student;

//    Student *pStu=malloc(sizeof(Student));

//    pStu->age=20;

//    

//    //内存释放,160个字节归还系统;

//    free(pStu);

    

    

    

    char arr[16]="hei215bai4hong2";

   int count=0;int arr1[20]={0};

   for (int i=0; i<16; i++) {//while循环更好

       if (arr[i]!='\0'&&arr[i]>='0'&&arr[i]<='9') {

//            printf("%d",arr[i]);

//              arr1[count]=arr[i];

//              count++;

            

        }

    }

   int j=0,i=0;

//    while (arr[i]!>'0'&&arr[i]<='9')

//    {

//        p[j]=arr[i]-'0';// ***

//        j++;

//    }

    

   printf("%d",count);//

//    for (int i=0; i<count; i++) {

//        printf("%d ",arr1[i]);

//    }

    

//    typedef struct numb{

//    

//    }/

   int *p=malloc(sizeof(int)*count);

    //循环求个数

    //根据个数开辟足够大的空间

    //循环提取数字(控制字符下标)

    //打印保存的结果

    

    

  char a[]="mingren",b[]="zuozhu",c[]="xiaoying";

   char *words[3]={0};

  //定义一个临时数组,用于存放单词。

   char temp[50]={0};

   for(int i=0;i<3;i++){

       scanf("%s",temp);//存放输入的单个单词

       unsignedlong length =strlen(temp);

        

        words[i]=malloc(length+1);

        //将输入的内容拷贝到堆空间里

       strcpy(words[i], temp);

    }

   for (int i=0; i<3; i++) {

       printf("%lu %s\n",strlen(words[i]),words[i]);

       free(words[i]);//***

    }

    

    //***堆空间由程序员管理,有开辟malloc(大小)就要有释放,否则会有泄漏!calloc(n,size);realloc原有空间不够用,在原来基础上扩大缩小;如果 void*realloc(void*p,unsigned newSize);  realloc(p,200) free       返回值都是首地址。

    //void * memset(<#void *#>, <#int#>, <#size_t#>)

    //calloc(1,100);==int *p=malloc(100);memset(在哪改,改成什么,改多少字节);

    //memcpy(拷到哪个地址,从哪拷,拷多少字节);

   //

    

    //下一章函数指针很重要

    

   return 0;

}


0 0