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

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

3天内不再提示

C语言的哪些函数会导致内存溢出?如何改进?

学益得智能硬件 来源:学益得智能硬件 2023-08-01 17:06 次阅读

看一道大华的面试题,题目并不难。

问strcat strncat strcmp strcpy哪些函数会导致内存溢出?如何改进?

这几个函数,要说跟内存溢出没有关系的,只有strcmp。

它的功能只是比较两个字符串是否相等,给定地址,然后从地址开始逐个向后比较,并不涉及写内存,所以也不存在溢出的说法。

剩下的三个函数都有可能导致内存溢出。

就拿strcpy来说,作用就是把源字符串拷贝到目的内存中,实现的方法就是循环逐个赋值,如果源字符串过长,strcpy也不好把控,这样就会导致一些未知的情况发生。

那么有人可能会问,strcpy里面为什么不做个判断,如果目的内存不够,就停止赋值。

我们来看下strcpy的参数

char *strcpy(char *dest, const char *src);

只有两个地址,在C语言中,只给你一个地址,是不好知道从这个地址开始,向后多少个字节是能用的。

于是在某些平台上,就出现了strcpy_s这样的函数。

strcpy_s(char *dest, int size, const char *src);

功能和strcpy差不多,就是多了个参数,第二个参数表示目的内存的大小,这样在拷贝的时候,就能精确的判断出内存是否越界。

当然了,如果你传参的时候瞎写了一个长度,这就不是函数的问题了,是你的问题。

strcat也是用样的问题,把一个字符串接在另一个字符串的后面,这个过程也没有考虑内存越界的问题。

strncat虽然可以指定连接的字符个数,但是函数内部在使用内存的时候,也没有做内存越界的判断,越不越界只能靠用户自己把握。




审核编辑:刘清

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

    关注

    180

    文章

    7604

    浏览量

    136811
  • 内存溢出
    +关注

    关注

    0

    文章

    10

    浏览量

    1202

原文标题:C语言的哪些函数不安全

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言函数调用过程中的内存变化解析

    相信很多编程新手村的同学们都会有一个疑问:C 语言如何调用函数的呢?局部变量的作用域为什么仅限于函数内?这个调用不是指C
    的头像 发表于 12-11 16:21 3765次阅读

    C语言使用函数调用的知识点

    C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存
    发表于 09-07 11:47 838次阅读

    C语言内存知识总结:memset函数和calloc函数

    memset(翻译:清零)是计算机中C/C++语言初始化函数。作用是将某一块内存中的内容全部设置为指定的值, 这个
    发表于 10-24 10:40 1131次阅读

    详解C语言中整形溢出问题

    整型溢出有点老生常谈了,bla, bla, bla… 但似乎没有引起多少人的重视。整型溢出会有可能导致缓冲区溢出,缓冲区溢出
    的头像 发表于 11-06 10:58 1273次阅读
    详解<b class='flag-5'>C</b><b class='flag-5'>语言</b>中整形<b class='flag-5'>溢出</b>问题

    CodeVisionAVR C语言函数介绍

    CodeVisionAVR C语言函数介绍 目录:1. Character Type Functions - 字符类型函数2. Standard
    发表于 04-22 10:17 108次下载

    MSP430 C语言编程的程序堆栈溢出分析

    MSP430 C语言编程的程序堆栈溢出分析
    发表于 05-16 15:04 40次下载

    MicroBlaze:malloc 函数动态分配内存溢出

    首先说明一点,MicroBlaze C函数库支持标准的内存管理函数,如malloc(),calloc(), free(),这些标准的C
    发表于 02-11 11:43 1925次阅读
    MicroBlaze:malloc <b class='flag-5'>函数</b>动态分配<b class='flag-5'>内存</b><b class='flag-5'>溢出</b>

    C语言使用函数调用在内存中究竟发生了什么?

    C语言使用函数调用,我们再熟悉不过了,但是函数调用在内存中究竟发生了什么真的清楚吗?只有搞清楚内存
    的头像 发表于 01-13 14:09 1178次阅读

    如何解决内存溢出

    ,有时候自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件,而由系统配置、数据流、用户代码等原因而导致内存溢出错误,即
    的头像 发表于 09-25 10:54 1424次阅读
    如何解决<b class='flag-5'>内存</b><b class='flag-5'>溢出</b>

    java内存溢出排查方法

    Java内存溢出(Memory overflow)是指Java虚拟机(JVM)中的堆内存无法满足对象分配的需求,导致程序抛出OutOfMemoryError异常。
    的头像 发表于 11-23 14:46 3242次阅读

    c语言整型数据的溢出计算

    C语言编程过程中,对于整型数据的溢出问题需要特别关注。当整型数据的值超过了它所能表示的范围时,会发生溢出现象,导致结果不准确甚至出现异常。
    的头像 发表于 11-30 11:45 3443次阅读

    c语言中数据溢出是归0还是归1

    C语言中,数据溢出通常不会自动归0或归1,而是发生未定义行为。这是因为C语言中的数据类型都有一定范围,超出该范围的值
    的头像 发表于 11-30 11:47 2841次阅读

    jvm内存溢出该如何定位解决

    在Java应用程序中,JVM(Java虚拟机)内存溢出是指Java应用程序试图分配的内存超过了JVM所允许的最大内存大小,导致程序无法正常执
    的头像 发表于 12-05 11:05 1339次阅读

    内存溢出内存泄漏:定义、区别与解决方案

    与区别 1. 定义: 内存溢出(Memory Overflow)指的是程序在申请内存时,无法获得足够的内存空间,导致程序抛出异常或崩溃。当程
    的头像 发表于 12-19 14:10 2782次阅读

    C语言内存泄漏问题原理

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