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

    文章

    7596

    浏览量

    135998

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

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

收藏 人收藏

    评论

    相关推荐

    关于C语言结构体内存对齐

    今天给大家带来一道经典、易错的关于C语言结构体内存对齐的题目:
    的头像 发表于 04-14 12:51 6844次阅读

    关于C语言结构体内存对齐

    今天给大家带来一道经典、易错的关于C语言结构体内存对齐的题目。
    发表于 09-08 11:54 464次阅读

    一文详解C语言内存管理

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

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

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

    C语言中数组和结构体的内存表示和布局

    C语言中,数组和结构体都可以代表一块内存,但为什么结构体可以直接赋值,而数组不可以?这个问题涉及到C语言的设计哲学、语法规则以及
    发表于 08-28 10:54 1426次阅读

    C语言中的动态内存管理知识

    概述:C语言的优势是可以直接访问内存地址,也就是指针操作,但其缺陷也是因为直接内存访问。如何通过防御性编程提前发现问题,尽可能减少
    发表于 09-22 09:54 458次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的动态<b class='flag-5'>内存</b>管理知识

    C语言的底层操作

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

    C语言教程之获取BIOS常规内存容量

    C语言教程之获取BIOS常规内存容量,很好的C语言资料,快来学习吧。
    发表于 04-25 16:43 0次下载

    C语言的sizeof操作符基础和经典问题

    C语言中,sizeof是一个操作符(operator),而不是函数!其用于判断数据类型或者表达式长度(所占的内存字节数)。其两种表达形式
    的头像 发表于 04-04 17:39 2650次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>的sizeof<b class='flag-5'>操作</b>符基础和经典问题

    单片机C语言C语言为什么差异?

    许多小伙伴在学完C语言后想入门单片机,但学着学着发现明明都是C语言,为什么单片机C语言和我当初学
    发表于 09-01 16:39 3739次阅读

    不同环境下C语言操作

    目录一.C语言知识回顾篇二.不同环境下运行C语言代码一.C语言知识回顾篇1.
    发表于 01-13 15:30 2次下载
    不同环境下<b class='flag-5'>C</b><b class='flag-5'>语言</b>的<b class='flag-5'>操作</b>

    C语言内存问题如何解决

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

    聊聊嵌入式C语言内存的问题

    C 语言内存问题,难在于定位,定位到了就好解决了。
    发表于 06-25 08:59 1555次阅读
    聊聊嵌入式<b class='flag-5'>C</b><b class='flag-5'>语言</b>踩<b class='flag-5'>内存</b>的问题

    嵌入式C语言高手炼成之内存操作

    在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能
    的头像 发表于 12-11 17:20 480次阅读

    C语言内存泄漏问题原理

    内存泄漏问题只有在使用堆内存的时候才会出现,栈内存不存在内存泄漏问题,因为栈内存会自动分配和释放。C
    发表于 03-19 11:38 462次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b><b class='flag-5'>内存</b>泄漏问题原理