• 基础C语言知识串串香3☞size_t类型


    6217760-7a1d63bdb0bc5b7a.jpg

    文章参考微信公众号[嵌入式软件学习圈]

    size_ t类型

    C语言标准规定size_t是一种无符号整数类型,编译器可以根据操作系统的不同而用typedef来定义不同的size_t类型,即在不同的操作系统上所定义的size_t 可能不一样。

    例如在32位操作系统上可以将size_t定义为unsigned int类型,而在64位操作系统上则可以定义为unsigned long int类型,甚至还可以将size_ t定义为unsigned long long int类型。

    size_t类型的引入增强了程序在不同平台上的可移植性,而它也正是为了方便系统之间的移植而定义的。

    size_t类型的变量大小足以保证存储内存中对象的大小,任何表示对象长度的变量,包括作为大小、索引、循环计数和长度的整数值,都可以声明为size_t类型。比如我们常用的sizeof操作符的结果返回的就是size_t类型,该类型保证能容纳实现所建立的最大对象的字节大小。size_ t 类型的限制是由SIZE_ MAX宏指定的。

    接下来看看size_ t类型的使用示例:

    char *copy (size_t n,const char *str )
    {
        int i;
        char *p;
        if ( n == 0 ){   
            /*处理n==0的情况*/
        }
        p = (char * )malloc(n) ;
        if (p == NULL){
            /*处理p==NULL的情况*/
        {
        for( i=0; i<n; ++i){
            p[i] = *str++ ;
        }
        return p;
    }
    

    不难发现,代码中存在着一个严重的问题:当p所引用的动态分配的缓冲区在n> INT_MAX时将会发生溢出。我们知道,int 类型的限制是由INT_MAX宏指定的,而size_t 类型代表的是一个无符号整数类型,它可能包含一个大于INT_MAX的值。因此,当n的值为0<n<= INT_MAX时,执行循环n次,代码如预期一样正常运行;但当n的值为INT_MAX<n<= SIZE_MAX,且整型变量i的增值超过INT_MAX时,i 的值将是从INT_MIN开始的负值。这时,p[i] 所引用的内存位置是在p所引用的内存之前,这就会导致写入发生在数组边界之外。

    因此,为了避免发生这种潜在性的错误,应该将变量i也声明成size_t类型,同时利用宏定义SIZE_MAX来检查输入的有效性,修改后的程序如下所示:

    char *copy (size_t n, const char *str )
    {
        size_t i;
        char * p;
        if(n == 0 || n > SIZE_MAX){   
            /*处理输入无效的情况*/
        }
        p = (char*)malloc(n);
        if( p == NULL ){
            /*处理p==NULL的情况*/
        {
        for ( i=0; i<n; ++i ){
            p[i] = *str++;
        }
        return p;
    }
    

    往期热文:
    基础C语言知识串串香(1)

    基础C语言知识串串香(2)


    ===========我是华丽的分割线===========


    更多知识:
    点击关注专题:嵌入式Linux&ARM

    或浏览器打开:https://www.jianshu.com/c/42d33cadb1c1

    或扫描二维码:

    6217760-e6bba06e005d8fe7.jpg

  • 相关阅读:
    Unity apk开机自启动一次
    Unity调用Android
    实验 1 Linux 系统的安装和常用命令
    课堂测试3第一阶段数据清洗
    Tutorial_6 运行结果
    Command 'ifconfig' not found, but can be installed with: sudo apt install net-tools VM Ubuntu 解决方案
    《规划极限编程》阅读笔记03
    软件工程_个人课程总结
    《规划极限编程》阅读笔记02
    学习进度_第十六周
  • 原文地址:https://www.cnblogs.com/leon1124/p/14039760.html
Copyright © 2020-2023  润新知