strncpy和memset

为什么要把strncpy和memset放一块, 是因为这两个经常组合起来一起用的。 在strncpy()之前,先memset()一下。 一般是讲各个字节置为0.
首先看看memset()的源码:

void* memset(void* s, int c, size_t n)
{
      unsigned char* p = (unsigned char*) s;
      while (n > 0) {
           *p++ = (unsigned char) c;
           --n;
      }
      return s;
}

它是将以地址s开始的n个字节的值设置为指定的值c。

void convert_file_path(char *file_path)
{
     char *path = “/home”;
     memset(file_path, 0×00, sizeof(file_path));
     strncpy(file_path, path, strlen(path));
     printf(“%s \n”, file_path);
}

写了一个这样简单的代码。 结果它输出的确是后面会有乱码出现。
乱码是因为访问了不该访问的内存。 首先检查strncpy()函数。是字符串没有添加结束符('\0')。所以我们可以这样改代码:
strncpy(file_path, path, strlen(path) + 1);
或者:
strncpy()后,在字符串后面添加”:

*(file_path + strlen(path)) = 0;


虽然百度百科上介绍strncpy (http://baike.baidu.com/view/1207711.htm)
都说:
1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n=(0, src串长度),src的前n个字符复制到dest中。但是由于没有NULL字符,所以直接访问dest串会发生栈溢出的异常情况。
如果n = src串长度,与strcpy一致。
很明显,百度百科上也是错误的。 (尽信书不如无书)。

代码中还犯了一个错误,很明显是在memset()函数。 因为我是一个函数, file_path是一个指针。
所以我memset(file_path, 0×00, sizeof(file_path)),只是将前4字节置为了0。(sizeof(file_path) == 4)。
更正如下:
memset(file_path, 0×00, sizeof(file_path) * 100);
100只是我随便写的数字。 应该是数组的长度。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值