一级指针易错点整理

小灰灰 2022-08-28 05:39 271阅读 0赞

文章目录

  • 易错点
    • 越界问题
    • 指针叠加会不断改变指针指向
    • 返回局部变量地址
    • 同一块内存释放多次(不可以释放野指针)

易错点

越界问题

  1. void test(){
  2. char buf[3] = "abc";
  3. printf("buf:%s\n",buf);
  4. }

末尾还有\0,应该设置buf[4]

指针叠加会不断改变指针指向

如下面案例,每次对p++,就修改了指针的指向

  1. void test(){
  2. char *p = (char *)malloc(50);
  3. char buf[] = "abcdef";
  4. int n = strlen(buf);
  5. int i = 0;
  6. for (i = 0; i < n; i++)
  7. {
  8. *p = buf[i];
  9. p++; //修改原指针指向
  10. }
  11. free(p);
  12. }

返回局部变量地址

如下面函数,如果返回str,当函数调用完后,系统会释放函数中的临时变量,最终就不能获得str里面的值,正确的应该用实际参数来保存当前字符串变量内容。

  1. char *get_str()
  2. {
  3. char str[] = "abcdedsgads"; //栈区,
  4. printf("[get_str]str = %s\n", str);
  5. return str;
  6. }

同一块内存释放多次(不可以释放野指针)

  1. void test(){
  2. char *p = NULL;
  3. p = (char *)malloc(50);
  4. strcpy(p, "abcdef");
  5. if (p != NULL)
  6. {
  7. //free()函数的功能只是告诉系统 p 指向的内存可以回收了
  8. // 就是说,p 指向的内存使用权交还给系统
  9. //但是,p的值还是原来的值(野指针),p还是指向原来的内存
  10. free(p);
  11. }
  12. if (p != NULL)
  13. {
  14. free(p);
  15. }
  16. }

free()函数的功能只是告诉系统 p 指向的内存可以回收了(p 指向的内存使用权交还给系统),p的值还是原来的值(野指针),p还是指向原来的内存

例如下面程序,释放前后p的指向不变,只是告诉系统,可以回收了,系统去回收。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. void test() {
  5. int *p=NULL;
  6. p = (int *)malloc(sizeof(int));
  7. printf("释放前p指向:%d\n",p);
  8. free(p);
  9. printf("释放后p指向:%d", p);
  10. }
  11. int main()
  12. {
  13. test();
  14. return 0;
  15. }

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,271人围观)

还没有评论,来说两句吧...

相关阅读

    相关 前端整理

    HTML 1 网页中三种最基本的页面组成元素是\_\_\_\_ 文字\\图像\\超链接 。 2表单是Web\_客户端和服务器端之间实现信息交流和传递的桥梁。 3表单实