zoukankan      html  css  js  c++  java
  • 小心C语言野指针

    本博客文章合集

    指针是C语言一个很强大的功能。然而所谓成也萧何,败也萧何,用好了指针会使程序大放异彩,用错了指针轻者只是报个错,重者可能整个系统都崩溃了。本篇我们来谈谈指针一种错误的使用方法”野指针“。
    野指针一般是指定义时没有给初值的指针变量。来看以下程序:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
    char *source1 = "abc";
    char *source2;
    printf("source2的值是:%u
    ", source2);
    strcpy(source2 , source1);
    printf("%s",source2);
    
    return 0;
    }
    


    这段程序定义了一个指向字符的指针source2,但是没有给它一个初始值。下面的代码就是将字符串”abc“复制到source2中,编译的结果如下:
    --------------------Configuration: Test - Win32 Debug--------------------
    Compiling...
    demo.c
    D:CCodeTestdemo.c(8) : warning C4700: local variable 'source2' used without having been initialized
    Linking...

    Test.exe - 0 error(s), 1 warning(s) 

    编译给出一个告警,说source2没有初值就被使用了。你可以无视这个告警,并且运行程序,但是运行的结果可能是灾难性的。

    由于source2在定义时没有给初值,程序运行时系统会默认给source2一个值,我们可以将程序中的 
    strcopy(source2 , source1);
    printf("%s",source2);
    这两行代码注释掉,然后运行程序,看看source2输出的值是多少。运行结果如下:

    source2的值是:3435973836
    Press any key to continue

    可见source2被系统赋予一个值3435973836,而3435973836是一个内存的地址,至于是哪段内存地址,谁也不知道,可能是操作系统本身所在的内存地址,也可能是一个空的内存地址。如果是操作系统本身所在的内存地址,通过strcopy函数将”abc“复制给了这段内存地址,也就是修改了操作系统本身内存数据,你的计算机可能就崩掉了!所以指针在定义时一定要给一个初值,比如”NULL“。在本程序中,除了给source2赋初值外,还需使用malloc函数分配一块存储空间,使得source2指向这块存储空间。修改的程序如下:

    #include <stdio.h>
    #include <string.h>
    #include<malloc.h>
    
    int main()
    {
    char *source1 = "abc";
    char *source2 = NULL;
    printf("source2的初始值是:%u
    ", source2);
    source2 = (char *)malloc(100);
    printf("source2的分配值是:%u
    ", source2);
    strcpy(source2 , source1);
    printf("%s",source2);
    
    free(source2);
    source2 = NULL;
    
    return 0;
    }
    


    在定义source2时赋初值NULL,在使用source2时分配一段内存空间,不用source2时释放内存空间,并且重新赋值NULL。

  • 相关阅读:
    【LeetCode】两个有序数组合成一个有序数组(NEW)
    swiftmonkey 源码剖析及二次开发思路
    CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇
    Vue 5小时学习小教程
    【LeetCode】两数相加
    (vue.js)vue中引用了别的组件 ,如何使this指向Vue对象
    Monkey for Mac 环境配置
    [Vue] 初识Vue-常用指令
    利用Tkinter做的自动生成JSONSchema的小工具
    Linux下如何删除非空目录
  • 原文地址:https://www.cnblogs.com/itblog/p/11216921.html
Copyright © 2011-2022 走看看