美文网首页
C/C++ 第一课 signed、数组、malloc

C/C++ 第一课 signed、数组、malloc

作者: XX杰 | 来源:发表于2022-10-30 20:31 被阅读0次

    1、关键字

    signed 有符号的 有 负数
    unsigned 无符号的 没有 负数 最小值是 0
    取值范围不一样 signed int i = -10;
    不同的数据类型,所占据的 字节数 不一样, int long char double

        signed int a = -10;
        unsigned int b = -8;
        long c = 1233445L;
    
        cout<< sizeof(a) << endl;
        cout<< sizeof(b) << "  "<< b << endl;
        cout<< sizeof(c) << "  "<< c << endl;
    
    结果:

    4
    4 4294967288
    8 1233445
    **所以,b的值是错误的。 声明变量的时候,默认是 signed 有符号的在修饰 **

    image.png
    上面的 表格 需要根据实际的系统 来确定(16 位(早期) 32 位 64位)。以前的long 是4字节,现在的是 8 字节
    int32_t: 4个字节的 int
    int64_t:8个字节的 int 只是取值范围不一样,为了就是内存的分配而神明的
    这两个并不是基本数据类型,而是 C 中重新定义的 一个数据类型
    建议使用这种方式,因为无论在 32位的系统还是64位的系统,都规定了他的数据范围,以便我们使用不同的系统,最后取值的时候,出问题

    2、printf("%d/n") %d 是占位符。%s %f 等

    类似于 java 中的 String.format() 中的用法 第一个中的图片后面有占位符

    3、数组与 内存布局

    C 中的 数组定义 必须声明长度,或者 复制
    // sprintf 方法就是把后面的 字符串 复值给数据, char数组可以当 string 来用
        char str[100];
        for (int i = 0; i < 4; i++)
        {
            sprintf(str, "hello majie %d is num.", i);
            printf("%s\n", str);
        }
    // C++ 中的 string 的使用与 java 类似
        string text = "ertyui";
        text.append(" majie");
        printf("%s %d\n", text.c_str(), text.length());
    

    int a[10]; // 如果int 是 4 字节, 这个数据大小就是 40 基本数据类型,存放在 栈区。栈的大小 大概 1M / 2M。不同的系统不一样
    在linux系统下,使用ulimt -a 命令可以查看 栈的大小。当数据占用过高,数组声明的大小过大的时候,会出现stackOverFlow 的错误,也就是 栈内存溢出了
    因为数组声明的时候需要指定大小,也就是会分配内存。 数组声明的过大,即使没有数据也会造成 stackOverFlow 的错误。

    动态申请内存,在堆中 方法 malloc calloc realloc

    因为栈的大小有限,但是在程序运行期间往往会需要一块较大的内存。所以这时候需要把内存声明在 堆 中。
    malloc 方法 返回的是 void * 的类型,也就是任何的数据类型的指针 
    
        size_t size = 1 * 1024 * 1024;
        // 在堆中 申请 1M 的内存
        int *j = (int *) malloc(size);
        // 初始化申请的内存中的数据 数据是 0 长度是 size
        /**
         * 为什么需要调用 memset 方法,对申请的内存地址进行初始化呢?
         * 答案:  为我们申请的这块内存地址,可能是 重复使用的 内存。
         *       里面已经有别的数据,在我们使用的时候容易出现错误。
         *       所以,我们一般都紧接着调用 memset 初始化
         * */
        memset(j, 0, size);
         // 对 malloc 申请的内存进行扩容
        realloc(j, size * 2);
        // 使用完 之后,必须记得释放
        free(j);
        // calloc 申请内存,并将内存初始化 为 0  第一个参数为大小,第二个参数是需要使用的 类型sizeof
        int *jj = (int *) calloc(10, sizeof(int));  // 10 * 4   因为sizeof(int)=4
        free(jj);
    // alloca() 对栈中进行申请内存,一般不使用
    

    4、在内存中的结构是什么样的?

    内存布局解释.jpg
    堆中的内存分配是从低地址 往 高地址 进行分配的。分配的方式有两种,(也就是 malloc 的内部调用有两种)
    1、当分配的内存小于我们配置的某个值(128K)的时候,使用 brk 的方式来申请
    从低地址往高地址顺序的申请一块内存。当低地址有内存释放的时候,他的位置会移动
    2、当需要分配的内存大的时候,使用 mmap 来申请
    找一块满足大小的内存

    5、.h 文件用来声明类,.c 文件用来实现方法

    java 中 使用 import 进行 依赖,但是 依赖的对象 的 依赖 是无法使用的。 也就是无法进行传递 引入
    c 中使用 include 进行的依赖,是可以进行传递的,也就是说,include 引入的 引入,可以直接使用
    include 使用 引号 来引入,表示 查找相对路径, 使用<>来表示 查找我们配置的目录,和系统默认目录

    相关文章

      网友评论

          本文标题:C/C++ 第一课 signed、数组、malloc

          本文链接:https://www.haomeiwen.com/subject/lepttdtx.html