0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言内存操作有哪些陷进

Q4MP_gh_c472c21 来源:搜狐网 作者:搜狐网 2020-09-22 14:45 次阅读

1、返回局部变量的地址,或者返回指向局部变量的指针

int *stackref()

{

int val;

return &val;

}

2、引用已经被释放了的堆内存(野指针)

int * heapref(int n, int m)

{

int i;

int *x, *y;

x = (int *)malloc(n * sizeof(int));

/* 各种操作 */

free(x);

x = NULL;

y = (int *)malloc(m * sizeof(int));

for(i = 0; i 《 m; i++) {

y[i] = x[i]++; // 此处的x之前已经被释放了!

}

}

3、内存泄漏

malloc和free没有配套使用

void leak(int n)

{

int *x = (int *)malloc(n * sizeof(int));

return;

}

或者:

char *p = (char *)malloc(10);

p = (char *)malloc(10);

结构体资源释放常见内存泄漏问题

struct a{

int buf_size;

char *buf;

};

struct a *p = (struct *a)malloc(sizeof(struct a));

忘记给成员buf分配空间就使用

释放的时候,忘记释放buf

先释放了p,再释放buf

free(p);

free(p-》buf);

多步骤内存初始化

char *buf1;

char *buf2;

int module_init()

{

buf1 = (char *)malloc(100);

if(buf1 == NULL)

return -1;

buf2 = (char *)malloc(100);

if(buf2 == NULL)

return -1;//执行到这里,buf1内存泄漏

free(buf2);

free(buf1);

。..

}

解决对策是对出错处理修改成goto语句,而非直接return。

调用了会分配内存的函数,使用完未做内存回收处理。

实际开发最常见,常常是调用会分配内存的第三方函数库。

char *func ( )

{

return (char *)malloc(20); // make sure to memset this location to ‘’…

}

void callingFunc ( )

{

char * p = func ( ); // Problem lies here

。..

}

4、栈越界

{

char buf[5];

sprintf(buf, “%s”, “hello world”);

}

上面的代码导致栈缓冲区溢出,安全的做法是:

1)根据需求定义合适的buffer;

2)采用snprintf(buf, sizeof(buf), “%s”, “hello world”)来及时截断。

5、误认为从堆分配的内存被初始化为0

int *p = malloc(24 * sizeof(int));

char a[] = “abcdefghiafa”;

int i = 0;

while(a[i] != ‘’)

{

i++;

p[*a - ‘a’]++;

}

6、引用未初始化的指针,或者访问NULL指针

int *p;

int a = *p;

7、间接访问无效地址,类似于引用未初始化的指针

如从stdin读取一个int变量时,scanf(“%d”, &val);是正确用法,若误写为scanf(“%d”, val);时,val的值会被解释为一个地址,并试图向该地址写数据。在最好的情况下,进程立即异常中止。在最坏的情况下,val的值恰好对应于虚拟存储器的某个合法的具有读/写权限的内存区域,于是该内存单元会被改写,而这通常会在相当长的一段时间后造成灾难性的、令人困惑的后果。

8、堆越界

char *p = (char *)malloc(10);

char *q = (char *)malloc(10);

char a[20] = “abcdefghijklmno”

memcpy(p,a,sizeof(a));//可能无意中修改了q指针指向的堆数据

9、谨慎使用strcpy,memcpy等拷贝函数,字符串数组赋值之前或者定义之后最好memset一下

char p[10];

strcpy(p,“hello world!”);//数组越界

strncpy(p,“hello world!”,sizeof(p));//不越界,但是少了结尾‘’

memset(p,‘’,sizeof(p));

strncpy(p,“hello world!”,sizeof(p) - 1);//正确

10、使用未初始化的内存

char *p = (char *)malloc(10);

char a[10] = “abcd”;

strcpy(a,p);//结果未知

11、当使用malloc来申请内存时,应该用if(p != NULL)进行防错检查。

12、意图通过传递指针来分配内存

void *GetMemory(void *p,int n)

{

p = malloc(n);

return p;

}

char *p;

GetMemory((void *)p,10);

*p = ‘a’;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7528

    浏览量

    128354

原文标题:C语言内存操作的陷阱!你踩过坑吗?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文详解C语言内存管理

    C语言内存管理指对系统内存的分配、创建、使用这一系列操作
    发表于 07-26 16:04 475次阅读
    一文详解C<b class='flag-5'>语言</b><b class='flag-5'>内存</b>管理

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作

    小数在内存中是如何存储的?为什么C语言中的浮点数不支持位移操作
    发表于 08-16 09:24 663次阅读
    小数在<b class='flag-5'>内存</b>中是如何存储的?为什么C<b class='flag-5'>语言</b>中的浮点数不支持位移<b class='flag-5'>操作</b>?

    C语言内存管理详解

    C语言内存管理详解,很不错的一份资料.
    发表于 08-06 23:14

    C语言内存分配-通俗理解

    最近很多同学希望了解C语言内存分配,虽然可以在互联网上找到诸多的讲解,但是你会发现要么不通俗易懂,要么不算太全面。而这些对于新手而言,又绝对会把你弄得晕头转向的,所以在此对网上和书本上的诸般讲解
    发表于 10-08 14:57

    C语言的底层操作

    原因,那就是C语言对底层操作做了很多的的支持,提供了很多比较底层的功能。   下面结合问题分别进行阐述。   问题:移位操作   在运用移位操作
    发表于 04-23 11:56

    c语言指针详解

    不同,4字节或者8字节或者其他可能)。  第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式二叉树等等。  第三,有些操作必须使用指针。如操作申请的堆内存。还有:
    发表于 03-26 09:51

    什么是C语言C语言入门 ?精选资料分享

    C语言是一种通用计算机编程语言,应用广泛。 C语言的设计目标是提供一种编程语言,它可以编译,处理
    发表于 07-22 07:42

    【原创】聊一聊内存指针操作

    中,各种处理器都有对内存的不同的寻址方式读写内存。在高级语言中,C语言是唯一可以进行内存
    发表于 07-28 09:10

    C语言编程程序的内存如何布局

    重点关注以下内容:  C语言程序在内存中各个段的组成  C语言程序连接过程中的特性和常见错误  C
    发表于 09-13 15:04

    C语言相对于其他语言哪些特点

    操作系统(包括内核、驱动等)是使用C语言和汇编编写的,Windows,UNIX,Linux都是这样的。绝大部分是C语言,极少情况使用汇编写
    发表于 10-27 08:25

    linux基本操作C语言基础

    目录C语言基础C++linux基本操作io操作数据结构进程线程网络编程实战项目C
    发表于 12-17 07:53

    浅谈AVR c语言的位操作

    AVR c语言的位操作liquanhai 2009-09-17 02:48:00 3602 收藏 1分类专栏: 单片机C语言 文章标签:
    发表于 02-25 06:50

    C语言内存运行时不同变量是怎样分配的

    C语言内存运行时不同变量是怎样分配的?怎样验证C语言编译后的内存地址分配是否合理?
    发表于 02-25 06:37

    内存操作源代码

    语言是一门以中文作为程序代码编程语言学习例程:易语言-内存操作
    发表于 06-06 17:01 1次下载

    C语言内存问题如何解决

    大家好,我是杂烩君。 C 语言内存问题,难在于定位,定位到了就好解决了。 这篇笔记我们来聊聊踩内存。踩内存,通过字面理解即可。本来是操作这一
    的头像 发表于 06-22 11:37 258次阅读
    C<b class='flag-5'>语言</b><b class='flag-5'>内存</b>问题如何解决