zoukankan      html  css  js  c++  java
  • 一级指针易错情况

    一 char*字符串做函数参数

    二 字符数组越界

    三 修改了指针p指向的地址,又printf打印指针p指向的变量,或者想用free(p)去释放刚开始malloc的内存

    一 char*字符串做函数参数

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    void copy_str(char *from, char *to)
    {
      if (*from == '' || *to == '')
      {
        printf("function copy_str error ");
        return;
      }

      for (; *from != ''; from++, to++)
      {
        *to = *from;
      }
      *to = ''; //手动补充字符串结尾符
    }

    void main()
    {
      char *p = NULL;
      char to[100];

      copy_str(p, to);

      system("pause");
      return;
    }

    如上代码,可以放到编译器里运行下,是会直接崩掉的。为什么呢?

    因为 copy_str函数里的判断if (*from == '' || *to == '')。 形参from是指针,存储这指向的变量的内存地址,*from是指针from指向的变量的值。为什么这么判断直接崩溃了?

    因为我们没有保证from指针不为NULL就用*去取指针指向的变量了。

    正确的方法是if(from == NULL || to == NULL)去判断指针是否为空。

    然后再看是否判断需要判断指针指向的内容为'',再去判断*from == ''的情况

    二 字符数组越界

     char buf[5] = "Hello";  对于字符串,编译器会自动加''为Hello,导致数组越界

    三 修改了指针p指向的地址,又printf打印指针p指向的变量,或者想用free(p)去释放刚开始malloc的内存

      所以,不要随便改变形参的值。记得用个临时的指针变量char *tmp = p;去指向p指向的地址。后面改变tmp的地址即可。

    四 向函数外传递临时变量的地址

    char *str_cnct(char *x, char *y)
    {
      char str3[20];
      char *p = str3; //指针p指向数组的起始地址
      return p;
    }

    上面的代码中str3是str_cnct函数里的局部变量,存储在栈区,str_cnct函数执行结束后,str3的内存被回收了,return p把数组的地址返回给调用函数。

    使用该内存地址时候可能该位置存放的是别的变量的地址。

  • 相关阅读:
    最近面试被问到的问题总结(数据研发方向)
    机器学习利器——Scikit-learn的安装
    编写shell脚本遇到的问题
    DBCP配置数据库连接乱码问题
    eclipse的maven项目报Missing artifact jdk.toos:jdk.toos:jar:1.6错
    [备忘]Windows Server 2008 R2部署FTP FileZilla Server防火墙设置
    Hive-0.x.x
    使用ganglia监控hadoop及hbase集群
    开源监控软件ganglia安装手册
    [Hadoop in Action] 第7章 细则手册
  • 原文地址:https://www.cnblogs.com/fengxing999/p/10307919.html
Copyright © 2011-2022 走看看