透彻分析C/C++中memset函数
函数功能是:将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为指向s的指针,它是对较大的结构体或数组进行清零操作的一种最快方法。
/*===注意:这些例子如果同时运行需要在C++编译环境下===*/ int i = 0; // 例1:对字符数组进行初始化 char buf[10]; memset(buf, '\0', sizeof(char) * 10); // 0或者'\0'是等价的 for (i = 0; i < 10; ++i) { printf("%c", buf[i]); } printf("\n"); // 例2:对字符指针所指区域初始化,必须已经分配内存 char* pBuf = (char *)malloc(sizeof(char) * 10); if (pBuf != NULL) { memset(pBuf, 0, sizeof(char) * 10); // 0或者'\0'是等价的 for (i = 0; i < 10; ++i) { printf("%c", pBuf[i]); } printf("\n"); free(pBuf); pBuf = NULL; } // 例3:对整型数组进行初始化 int iBuf[10]; memset(iBuf, 0, sizeof(int) * 10); for (i = 0; i < 10; ++i) { printf("%d ", iBuf[i]); } printf("\n");
上面的这些例子已经比较清楚地展示了memset函数的使用,当然,很常见的还有对结构体进行这样的初始化操作,唯一的区别就是sizeof()的对象变成结构体即可,这里大家可以自己尝试。
// 例4:链式编程 int i = 0; char cBuf [10]; char cBuf1[10]; // 这里是关键!!! memcpy(cBuf1, memset(cBuf, 'a', sizeof(char) * 10), sizeof(char) * 10); for (i = 0; i < 10; ++i) { printf("%c", cBuf[i]); } printf("\n"); for (i = 0; i < 10; ++i) { printf("%c", cBuf1[i]); } printf("\n");
从上面这个例子中就可以看出,在memcpy这个函数中,直接使用了memset的返回值,用其来拷贝cBuf1这个字符数组,这样就可以直接连起来写,看起来十分方便。但是这个例子的应用形式却很少,只是为了说明这个问题才这样写的,具体的链式编程应用场合大家可以再仔细研究下,但是链式编程也使得代码变得有些不直观,所以要有所取舍。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233522.html原文链接:https://javaforall.net