zoukankan      html  css  js  c++  java
  • 《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的函数实现

      

  • 相关阅读:
    Leetcode 1489找到最小生成树李关键边和伪关键边
    Leetcode 113 路径总和 II
    hdu 1223 还是畅通工程
    hdu 1087 Super Jumping! Jumping! Jumping!
    hdu 1008 Elevator
    hdu 1037 Keep on Truckin'
    湖工oj 1241 畅通工程
    湖工oj 1162 大武汉局域网
    hdu 2057 A + B Again
    poj 2236 Wireless Network
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/10888347.html
Copyright © 2011-2022 走看看