《C库 — memset函数的用法》
1.memset函数原型
总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。(注意:会去修改内存得值,如果内存是只读,使用memset会出错)
重点需要注意一个细节:memset是以byte来填充的,也就是一个字节(8bit)一个单位来填充。
因此:如果int array[10]; memset(array, 1, 10);然后再把array的值打印出来,会得到一个错误的值。因为int是4个字节,因此再int类型中1的表现形式为“00000000000000000000000000000001”,然后将这32位填充1个byte中,高位被舍弃,也就是“00000001”,然后再填充一次就变成“0000000100000001”。那么array[0]其实在内存中存储的就是“00000001000000010000000100000001”。
2.示例
例1:memset是以字节为单位进行填充的
通过以上简单得例程,编译运行后理论上我们想要得得到得结果是array[0] = 1。
实际上:
将int array[10];
修改成:
char array[10];
结果就是我们想要得。
例2:memset会去修改内存中的值,去修改只读内存会造成段错误
运行结果:
因为char *s = “zhuangquan”是字符指针指向字符串常量。
C语言中定义为常量的值,是不允许被修改的,这是一个规则。如果有修改需求,就不要定义为常量,而是定义为变量。
在运行时,常量字符串会被存储在静态存储区,这段空间的特性就是只读的,任何修改属操作,均会引起整个程序崩溃。这也是C语言保证常量不可修改的一个手段。
(用const int i定义出来的也是常量,define定义的也是常量。包括‘A’以及ASCII表里面的以及0x01这些都是常量。都属于只读)
将*s修改成s[]就可以了
运行结果:
3.memset的函数实现