• 指针变量未分配空间或者初始化为空指针使用问题


    提示:关于指针


    前言

    在看c++书籍的时候,看到浅复制和深复制时,说到成员为指针的时候,会出异常。但是其实没有更多的感想,但是联想到上次考试指针没分配空间导致程序异常的情况,所以现在再验证一下。


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、指针的使用

    以下是验证代码。

    1. int main()
    2. {
    3. //这边是异常的,因为没有给指针分配空间,这个上次考试的时候,也遇到了,不过通过调试发现了改了。当时真是醍醐灌顶,切记。
    4. char *p = NULL;
    5. char str[] = "hello";
    6. memcpy(p, str, strlen(str));
    7. printf("%s",p);
    8. //这边是异常的,因为没有给指针分配空间
    9. int *p2 = NULL;
    10. int data = 12;
    11. *p2 = data;
    12. printf("%d",*p2);
    13. //打印12
    14. //这个是正常的,跟预想的不一样。
    15. int *p3 = NULL;
    16. int data3 = 12;
    17. p3 = &data3; //这边p指向了data的数据空间 p也就是被分配了空间
    18. printf("第一次打印p3:%d\n",*p3);
    19. int dataTest = 22;
    20. *p3 = dataTest;
    21. printf("第二次打印p3:%d\n",*p3);
    22. printf("打印data3:%d\n",data3); //这里注意data3的值也被改了
    23. return 0;
    24. }

    感想:其实里面涉及到一个问题,就是空指针不能解引用。

    另外空指针可以被另一个指针赋值,即指针指向另一个内存空间。

    为了深入了解一下指针的使用百度了一些资料如下

    指针与内存
    在C++中,一个指针必须在被分配内存之后,才能进行直接赋值的操作,如果没有进行内存的分配,直接对指针进行赋值,是会编译错误的,例如:

    int *p=123;   //这样是不可取的

    我们平时常用的分配内存方式是分配【栈内存】,例如:

    1. int k=123;
    2. int *p=&k;  
    3. *p=345;
    4. cout<

    因为123被放入了一个变量k中,系统为变量k分配了内存,指针p指向一个有内存空间的地址之后,就可以直接进行赋值了.

    动态分配内存:
    在系统中除了分配【栈内存】的方式外,还可以分配【堆内存】,分配方式如下:

    1. int *p=NULL;
    2. p=new int;                         //分配堆内存
    3. *p=123;                            //分配了内存之后,就可以直接进行赋值操作了

    关于指针赋值给指针

    C语言中,可以使用指针赋值运算符(=)将一个指针的值赋给另一个指针。指针之间的赋值实际上是将一个指针变量的值(即内存地址)赋给另一个指针变量。例如,假设有两个指针变量ptr1和ptr2,可以通过以下方式将ptr1的值赋给ptr2:```cptr2 = ptr1;```此时,ptr2将指向与ptr1相同的内存地址。需要注意的是,指针之间的赋值只是将内存地址赋给了另一个指针变量,而不是复制指针指向的内容。因此,修改其中一个指针指向的内存中的值也会影响另一个指针。```cint a = 10;int* ptr1 = &a;int* ptr2;ptr2 = ptr1; // 将ptr1的值赋给ptr2*ptr2 = 20; // 修改ptr2指向的内存中的值printf("%d", *ptr1); // 输出20,因为ptr1和ptr2都指向同一块内存```

    欢迎补充。


    总结

    所以,根据以上验证,得出一个结论,就是浅拷贝的主要问题就是导致两个指针指向同一块内存,存在潜在的风险!

  • 相关阅读:
    基于Java毕业设计制药企业人力资源管理系统源码+系统+mysql+lw文档+部署软件
    java计算机毕业设计高校多媒体设备报修管理系统源码+mysql数据库+系统+lw文档+部署
    JAVA小游戏 “拼图”
    推荐十个优秀的ASP.NET Core第三方中间件,你用过几个?
    微信小程序 24 播放音乐页的完善①
    大屏项目也不难
    【原创】技术出身的我,如何做好一个管理者?
    SSM(Spring SpringMVC MyBatis)配置文件信息,完成学生管理页面(前后端全部代码)
    dcoker命令操作
    Java排序算法(六):希尔排序
  • 原文地址:https://blog.csdn.net/2301_77560238/article/details/134090812