C语言学习笔记 入门篇-3

前言

本系列内容为程序媛学习C语言时做的笔记。以代码为主,并备注了打印结果以及详尽的解释注释。希望对你有所帮助。
C语言笔记入门篇包含多篇内容,当前位置:第3篇
C语言并不可怕,请沉下心来,耐心就有收获。
在这里插入图片描述

C中的布尔

0即true,只有0是false
//0.0 = 0 = false;
//-1 = 888 = true;

if (0) {
    printf("--");
} else {
    printf("==");//走这
}

静态/动态开辟内存(malloc)

#include <stdlib.h>

void RAMTest(){
    //静态开辟内存
    int arr[6];

    //静态开辟的内存大小是不能修改的,如果不需要动态修改空间大小,
    // 当然使用栈区【尽量使用静态开辟内存,如果实在需要动态改变,才使用下面。】
    //动态开辟内存
    int scanSize;
    printf("请输入空间大小");
    scanf("%d", &scanSize);
    int *arr_new = malloc(sizeof(int) * scanSize);//int *arr和int arr[]一样。

    //循环接收给每个元素赋值
    int i = 0;
    for (; i < scanSize; ++i) {
        printf("给第%d个元素赋值为:\n",i);
        int scan_num;
        scanf("%d", &scan_num);//获取用户手动输入的值
        arr_new[i] = scan_num;
    }

    //循环打印
    for (int j = 0; j < scanSize; ++j) {
        printf("输出结果:%d\n",arr_new[j]);
	//arr_new[j]  ==  *(arr_new+j)
    }
}

堆区空间加长(realloc)

//在堆区开辟新的空间,加长空间大小
void reallocTest() {
    int *arr = (int *) malloc(3 * sizeof(int));
    for (int i = 0; i < 3; ++i) {//赋值
        arr[i] = (10001 + i);
    }
    printf("开辟的内存指针: %p\n", arr);
    printArray(arr, 3);//打印数组

    int *new_arr = (int *) realloc(arr, 7 * sizeof(int));//void *:前面开辟的指针,7:数组总大小(旧的3+新增大小4)
    if (new_arr) {//判断是否新开辟成功【非0即true】
        for (int k = 3; k < 7; ++k) {//给新开辟的赋值
            arr[k] = 10001 + k;//给arr[k]和给new_arr[k]是一样的
        }
        printf("新 开辟的内存指针: %p\n", new_arr);
    }
    printArray(arr, 7);//打印数组

    if (new_arr) {
        free(new_arr);  //只需要free(new_arr)。在realloc的时候,后续新开辟的空间跟已存在的前三个元素是连续的,
        // 而且new_arr的指针跟arr的指针相同,都指向同一块堆空间,同一块堆空间只需要释放一次,多次释放会报错。
        new_arr = NULL;
        arr = NULL;
    } else {
        free(arr);
        arr = NULL;
    }

    /*打印:
	开辟的内存指针: 00142AB8
	元素0为:10001,内存地址为:00142AB8
	元素1为:10002,内存地址为:00142ABC
	元素2为:10003,内存地址为:00142AC0
	新 开辟的内存指针: 00142AB8
	元素0为:10001,内存地址为:00142AB8
	元素1为:10002,内存地址为:00142ABC
	元素2为:10003,内存地址为:00142AC0
	元素3为:10004,内存地址为:00142AC4
	元素4为:10005,内存地址为:00142AC8
	元素5为:10006,内存地址为:00142ACC
	元素6为:10007,内存地址为:00142AD0
     */
}

在这里插入图片描述

堆内存调用free释放

//打印静态开辟内存的地址
void dynamicAction() {
    int *p; // 野指针  没有地址的,空的

    // malloc返回void * ,可以任意转变成 int* /double *   
    int *arr = malloc(1 * 1024 * 1024); // 堆区开辟 1M

    printf("dynamicAction函数,arr自己的内存地址:%p,堆区开辟的内存地址:%p\n", &arr, arr);

    // C工程师,堆区开辟的空间,必须释放
    free(arr); // 释放掉
    arr = NULL; // 重新指向一块内存地址00000000
    //如果只调用free,arr没有置为NULL,则arr就是悬空指针,打印arr仍然为原先的地址指向,置为NULL后打印arr输出==>00000000
}

测试:dynamicAction()重复调用去开辟堆空间。
因为调用free之后,堆区开辟的内存地址就有重复的,因为你释放了,重复没有关系;
没有释放(free)就不能重复地址,否则错乱了。(以下打印为有调用free时的输出日志,地址会重复)
在这里插入图片描述

小结:

静态开辟(int arr[6])内存申请的是栈区的,动态开辟(malloc)申请的是堆区的。

栈区的成员可以自己释放,即每个函数进栈执行完后方法会弹栈,弹栈时候会将函数内的栈成员释放;堆区的必须手动释放。堆区可让开辟的内容会更大。

栈区:占用内存大小 最大值: 大概 2M 大于2M会栈溢出 平台有关系的
堆区:占用内存大小 最大值: 大概80% 40M没有任何问题,基本上不用担心 堆区很大的,大概80%: Windows系统 给我们的编译器给予的空间 的 百分之百八十。

	// int 4 * 10 = 40M
	// int arr[10 * 1024 * 1024]; // 10M * 4 = 40M  会栈溢出
	// int arr[1 * 1024 * 1024]; //4M 会栈溢出
	int arr[(int)(0.2 * 1024 * 1024)]; // 不会栈溢出

数组只存地址值
野指针是没有初始化,悬空指针是指向的地址被释放掉了,没有置为NULL。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C语言是一种广泛应用于计算机科学和软件开发的编程语言。它具有强大的功能和灵活性,适用于开发各种类型的应用程序。 C语言专题精讲篇是一个对C语言进行深入学习和讲解的系列文章或课程。它汇总了C语言相关的重要知识点和技巧,旨在帮助学习者更好地理解和运用C语言。 这个专题中的笔记涵盖了C语言的各个方面,包括基本语法、数据类型、运算符、流程控制、函数、数组、指针、结构体、文件操作等。通过系统性的学习和总结,这些笔记可以帮助学习者逐步掌握C语言的核心概念和常用技巧。 在这个专题中,学习者可以学到如何编写简单的C程序,如何使用变量和运算符进行计算,如何使用条件和循环语句控制程序流程,如何使用函数进行代码的模块化,如何使用数组和指针进行数据的处理,如何使用结构体组织复杂数据,如何进行文件的读写等等。 C语言专题精讲篇的目的是帮助学习者全面、深入地了解C语言的各个方面,并能够独立编写和调试简单到中等难度的C程序。通过反复实践和练习,学习者可以逐渐提高自己的编程能力,并为进一步学习更高级的编程语言打下坚实的基础。 总之,C语言专题精讲篇的笔记汇总是一份重要的学习资料,可以帮助学习者系统地学习和掌握C语言的基础知识和常用技巧,为他们未来的编程之路打下坚实的基石。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值