Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1152093
  • 博文数量: 115
  • 博客积分: 950
  • 博客等级: 准尉
  • 技术积分: 1734
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-08 20:46
文章分类

全部博文(115)

文章存档

2015年(5)

2014年(28)

2013年(42)

2012年(40)

分类: LINUX

2012-08-22 14:55:47

    相信大家对于这个函数还是比较熟悉的,都认识,也知道其做些什么。但是其有些
比较特别的地方就未必都能完全理清楚。先来看下以下一例:

点击(此处)折叠或打开

  1. char cbuff[20] = "ABCDEFGHIJKLMN";
  2. char src[] = "abcdefg";
  3. int num = sizeof(src) + 1;

  4. strncpy(cbuff, src, sizeof(src));

  5. printf("cbuff[%d]: %d\n", num, cbuff[num]);
    打印出来的是什么呢?

    如果你认为cbuff[num]是个空字符,恭喜你,你注意到以下这一点了。
    在man strncpy中,有这样两点需要注意:

点击(此处)折叠或打开

  1. char *strncpy(char *dest, const char *src, size_t n);

  2. 1. If there is no null byte among the first n bytes of src, the string placed in dest will not be null-terminated.

  3. 2. If the length of src is less than n, strncpy() pads the remainder of dest with null bytes.
    在此说明的是第二点,strncpy会自动把cbuff中后面的字符全部都替换成空字符。

    对于这一个现象,导致在调试过程中一个莫名的错误,只有程序中加上test函数,
就会crash。


点击(此处)折叠或打开

  1. 上层调用函数:
  2. int
  3. test()
  4. {
  5. char buff[128] = "0";
  6. ...
  7. libfun_call(buff, ...);
  8. ...
  9. }

  10. 调用的lib函数中libfun_call最后会调用到一个strncpy函数,然后复制到buff后返回到test函数
  11. int
  12. libfun_call(char *buff, ...)
  13. {
  14. ...
  15. strncpy(buff, data, MAX_DATA_LEN);
  16. ...
  17. }
  18. 这原本是没有什么问题的,但是很可惜,MAX_DATA_LEN值为256,上层buff只有128个字节
    这样返回的后果就是,libfun_call將上层test函数的buff后面的堆栈给破坏了,然后
程序就没有然后了,直接crash罢--工

   如此看来,在lib库函数的实现中,在使用strncpy时候是需要慎重,不然作为库函
数,不是方便功能实现,而是增加调试的难度和精力。


阅读(1413) | 评论(0) | 转发(0) |
0

上一篇:名落孙山

下一篇:SMP概念

给主人留下些什么吧!~~