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只是我随便写的数字。 应该是数组的长度。

你可能感兴趣的:(strncpy和memset)