与同事互相code review的时候,同事指出我的代码在使用strcpy,建议改为strncpy,避免缓冲区溢出问题。于是不加思索改为strncpy,谁知道不小心遇到strncpy另一个问题,也可能导致缓冲区溢出。

先贴上strncpy的函数原型:

char *strncpy(char *dest, const char *src, size_t n)

和strcpy相比多了一个参数n,意思是最多拷贝n个字节,以避免缓冲区的溢出。

我的代码是这样的:

char dest[8] = {0};char *src = "12345678";strncpy(dest, src, sizeof(dest));

如果不仔细看strncpy 的手册的话,看起来是没什么问题。但这其实是有问题的,strncpy 的最后一个参数n, 当n小于或等于src的长度时,会拷贝n个字节到dest,这n个字符不包含'\0'。也就是说上面的拷贝完成后dest数组内部是这样的:{'1','2','3','4','5','6','7','8'},即没有以'\0'结尾。

如果使用printf打印dest数组的话,结果是未知的,因为printf打印字符串直到遇到'\0'才会终止,所以除了打印dest的内容,还会打印dest数组相邻的内存的值,这是很危险的。

正确的用法是:

strncpy(dest, src, sizeof(dest)-1);

从而避免导致缓冲区溢出。

strncpy函数使用注意相关推荐

  1. 这是我转贴的strcpy函数与strncpy函数的比较,其中有些错误,建议大家还是看msdn,要好的多

    strcpy与strncpy函数 (1) Memset 原型:extern void *memset(void *buffer, int c, int count); 用法:#include 功能:把 ...

  2. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数

    strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...

  3. linux c之strncpy函数和strncmp函数最简单使用总结

    1.原型声明: char * strncpy(char *dest,const char *src, size_t n); strncmp() 用来比较两个字符串的前n个字符,区分大小写,其原型为: ...

  4. java strcpy,详解C语言中strcpy()函数与strncpy()函数的使用

    C语言strcpy()函数:复制字符串 头文件:#include 定义函数: char *strcpy(char *dest, const char *src); 函数说明:strcpy()会将参数s ...

  5. 再谈strncpy函数--值得一看的好文章

    strncpy()函数 原型:char*strncpy(char *dest, char *src, int n);     用法:#include<string.h>     功能:把s ...

  6. c语言字符串提取第二个字符,c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例...

    c语言如何复制字符串(取前n个字符)strncpy()函数的应用实例.函数需引入的头文件:#include 定义strncpy()函数:char * strncpy(char *dest, const ...

  7. 随想录(用memmove函数代替strncpy函数)

    [声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 有过C语言编程的朋友应该都有过指针越界的困扰.不管越界的地方是全局地址.还是局部地址,查起来都是 ...

  8. strncpy()函数详解

    strncpy()函数 原型:extern char *strncpy(char *dest, char *src, int n);     用法:#include <string.h>  ...

  9. C语言之strncpy函数

    [FROM MSDN && 百科] 原型:char * strncpy(char *dest, char *src, size_t n); #include<string.h&g ...

  10. strcpy()、strncpy()函数

    本片博客简单写下关于strcpy().strncpy()两函数的用法.区别及使用时需要注意的地方. 一.使用介绍 1. strcpy()函数用法 char * strcpy ( char * dest ...

最新文章

  1. IOS开发笔记6-C语言基础复习
  2. 控制台应用程序的根目录
  3. 从(0,0)到(n,n)——广度优先及其改进
  4. 自建裸金属实例Oracle RAC上云
  5. Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
  6. “CSDN开发助手”:【必备插件 · 安装与使用教程】
  7. 《中国人工智能学会通讯》——4.40 什么是类人概念学习?
  8. js date 加一天_需要知道的JS的日期的知识,都在这了
  9. 黑马程序员-黑马,人生的一个重要转折
  10. ppt将画好的箭头改为直线
  11. 程序员的忠告:为什么避免使用 SELECT * 查询,效率低?
  12. java安装及设置eclipse
  13. goland试用期过后继续使用方式
  14. 85款中国风字体!超级好看的古风系列
  15. zabbix mysql分开部署_Centos7 安装部署zabbix5.0服务端 超详细图文步骤
  16. 一些RGB色差度量公式
  17. 中国畜牧养殖机械设备行业研究及未来趋势报告(2022版)
  18. 路由器重温——DHCP/DNS服务配置管理-3
  19. 万字总结复杂而奇妙的高斯过程!
  20. 【有限元】弱反射光纤光栅水听器模态分析与谐响应分析

热门文章

  1. Numpy常用random随机函数汇总
  2. java startswith_Java startsWith() 方法
  3. 晃动电脑时屏幕闪烁怎么办?
  4. ToF传感器究竟有多神奇?本文告诉你!
  5. 软件构造 Lab-1 Report
  6. matlab fmincon函数格式,求助 fmincon 函数调用格式说明
  7. Python 离散余弦变换(DCT)
  8. 吧佬联手抵制奸商,百元级游戏电脑横出江湖
  9. git查看输入的用户名和密码是什么_git设置用户名密码的示例代码
  10. R语言中数据框的横向合并与纵向合并