动态内存分配

```
    //void test(){
//    int b = 7;
//    static int a  = 3;
//    a++;
//    b++;
//    printf("a = %d , b = %d\n", a, b);
//}



typedef struct student {
    int num;
    char name[20];

}Student;




void *fun(){
    char string[] = "adjid";
    return string;   //string 是局部变量  返回就错了   所以禁止这么返回
}
char fun1(){
    return 'c';
}

int main(int argc, const char * argv[]) {

    char *ret = fun();
    char ret1 = fun1();

    printf(" %c",ret1);
    只读  coust
    const int a = 0;
    a = 3;  //这时就错了


     static 静态   将局部变量  不被释放
    test();
    test();




      malloc()
    作用 : 在内存中开辟一块空间
    参数 : 开辟空间的大小(单位  :字节)
    返回值: 开辟空间的首地址
    int *p = malloc(4);
    int *p = malloc(sizeof(int));
    *p = 3;
    printf("%d \n", *p);

    int *p = malloc(sizeof(int) * 3);
    *p = 10;
    *(p + 1) = 11;
    *(p + 2) = 12;
    for (int  i = 0; i < 3; i++) {
        printf("%d ", *(p + i));
         printf("%d ", p[i]);
    }




    从键盘输入字符串,将字符串中的数字挑出来存到另一个数组

    char src[20] = {0};
    char des[20] = {0};
    int j = 0;
    printf("输入:");
    scanf("%s", src);
    for (int i = 0; i < strlen(src); i++) {
        if ( src[i] >= '0' && src[i] <= '9') {
            des[j] =  src[i];
            j++;
        }
    }
        printf("%s", des);




    1.开辟一个空间,存一个double类型的值,并打印
    double a = 2.432;
    printf("%f \n", a);


    2.开辟一个空间,存 8double类型的值,并打印每个元素
    double *p = malloc(sizeof(double) * 8);
    double val[8] = {12.12, 23.44, 43.6, 431.3, 674.34, 5.2, 34.34, 34.645};
    p = val;
    for (int i = 0; i < 8; i++) {
        printf(" %f ",*p++);
    }

    3.开辟一个空间,存一个结构体(student)类型的值(为每个成员赋值),并打印
    Student stu = {111,"aaa"};
    printf(" %d  %s", stu.num, stu.name);



    4.开辟一个空间,存 3 个结构体(student)类型的值(为每个成员赋值),并打印
    Student stu[3] = {{111,"aaa"},
                      {222,"bbb"},
                      {333,"ccc"}};
    for (int i = 0; i < 3; i++) {
        printf(" %d  %s\n", stu[i].num, stu[i].name);
    }


    输入3个单词,动态分配内存保存单词,并在最后输出
    char temp[20] = {0};
    char *words[3] = {NULL};
    for (int i = 0; i < 3; i++) {
        scanf("%s", temp);
        //计算输入的单词长度
        long len = strlen(temp);
        //开辟空间
        words[i] = malloc(sizeof(char) * (len + 1));
        //存储到开辟的空间中
        strcpy(words[i], temp);
    }
    for (int i = 0; i < 3; i++) {
        printf("%s\n", words[i]);
    }
    //释放空间
    for (int i = 0;i < 3 ; i++) {
        free(words[i]);
    }


    int a = 0;                       int *p = malloc(sizeof(int ));
    1.可以通过名字和地址访问             只能通过地址访问
    2.在编写代码是限定好大小             可以在执行时动态分配大小
    3.生存周期结束后系统自动释放          只能手动释放
    4.两次连续定义,地址连续             不一定连续
    5.栈区 -开辟小空间                  堆区- 大空间

    int a = 0 ;
    printf("栈  区:%p\n",&a);

    int *p = malloc(sizeof(int));
    printf("堆  区:%p\n",p);

    static int b = 0;
    printf("静态区:%p\n",&b);

    char *s = "adads";
    printf("常量区:%p\n", s);

    printf("代码区:%p", fun);





    / 动态内存分配方式
    // 目的:用一个正好的数组去存挑出的数字
    char src[100] = {0};
    int num = 0;

    scanf("%s", src);

    // 1, 先查出数字个数
    for (int i = 0; i < strlen(src); i++) {
        if (src[i] >= '0' && src[i] <= '9') {
            num++;
        }
    }
    // 2, 动态开辟一段空间, 并为\0多预留一个空间
    char *p = malloc(sizeof(char) * (num + 1));
    // 保存空间的首地址
    char *head = p;

    // 3, 存数字
    for (int i = 0; i < strlen(src); i++) {
        // 判断, 若为数字
        if (src[i] >= '0' && src[i] <= '9') {
            *p = src[i];
            p++;
        }
    }
    *p = '\0';
    printf("%s\n", head);
    周游老师  16:05:10
    1, 开辟一个空间, 存一个double类型的值, 并打印
    double *p = malloc(sizeof(double));
    *p = 5.5;
    printf("%.1f\n", *p);

    2, 开辟一个空间, 存8double类型的值, 并打印每一个元素
    double *p = malloc(sizeof(double) * 8);
    for (int i = 0; i < 8; i++) {
        *(p + i) = 100.0 / (i + 1);
        printf("%.1f ", p[i]);
    }


    3, 开辟一个空间, 存1个结构体(student)类型的值(为每一个成员赋值), 并打印
    Student *p = malloc(sizeof(Student));
    p->num = 1;
    p->sex = 'm';
    p->score = 99.9;
    strcpy(p->name, "superMan");

    printf("%d %s %c %.1f\n", p->num, p->name, p->sex, p->score);

    4, 开辟一个空间, 存3个结构体(student)类型的值(为每一个成员赋值), 并打印
    Student *p = malloc(sizeof(Student) * 3);
    for (int i = 0; i < 3; i++) {
        (p + i)->num = i;
        (p + i)->sex = 'm';
        (p + i)->score = 99.9 - i;
        strcpy((p + i)->name, "superMan");
        printf("%d %s %c %.1f\n", (p + i)->num, (p + i)->name, (p + i)->sex, (p + i)->score);
    }

“`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值