字符串学习中主要加深了对以前掌握中的盲点学习。
1,memcpy和memmove函数的区别
函数的原型如下:
memcpy 函数从src 所指的内存地址拷贝n 个字节到dest 所指的内存地址,和strncpy 不同,memcpy
并不是遇到'/0' 就结束,而是一定会拷贝完n 个字节。这里的命名规律是,以str 开头的函数处理以'/0' 结尾的字符串,而以mem 开头的函数则不关心'/0'
字符,或者说这些函数并不把参数当字符串看待,因此参数的指针类型是void * 而非char * 。
memmove 也是从src 所指的内存地址拷贝n 个字节到dest 所指的内存地址,虽然叫move但其实也是拷贝而非移动。但是和memcpy 有一点不同,memcpy
的两个参数src 和dest 所指的内存区间如果重叠则无法保证正确拷贝,而memmove 却可以正确拷贝。假设定义了一个数组char buf[20] = "hello world/n"; ,如果想把其中的字符串往后移动一个字节(变成"hhello
world/n" ),调用memcpy(buf + 1, buf, 13) 是无法保证正确拷贝的。
2,C标准库的I/O缓冲区。
C标准库的I/O缓冲区有三种类型:全缓冲、行缓冲和无缓冲。当用户程序调用库函数做写操作时,不同类型的缓冲区具有不同的特性。
- 全缓冲 如果缓冲区写满了就写回内核。常规文件通常是全缓冲的。行缓冲 如果用户程序写的数据中有换行符就把这一行写回内核,或者如果缓冲区写满了就写回内核。标准输入和标准输出对应终端设备时通常是行缓冲的。 无缓冲 用户程序每次调库函数做写操作都要通过系统调用写回内核。标准错误输出通常是无缓冲的,这样用户程序产生的错误信息可以尽快输出到设备。观察下面的实例:
当直接运行时,发现终端并没有输出“Hello ,world”,将注释去掉或将将printf("Hello,world")替换成printf("Hello, world/n")都能打印出“Hello ,world”。从上面的例子证明,C标准输出是行缓冲。
上图是C标准库的I/O缓冲区
3787

被折叠的 条评论
为什么被折叠?



