c/c++语言开发共享编写memset函数时出现问题

我正在编写memset函数,我的代码如下,我遇到了问题

 void* memsetFun(void* pointer, int c, int size) { if ( pointer != NULL && size > 0 ) { unsigned char* pChar = pointer; int i = 0; for ( i = 0; i < size; ++i) { unsigned char temp = (unsigned char) c; *pChar++ = temp; // or pChar[i] = temp (they both don't work) } } return pointer; } 

我也试过pChar [i] =我们想要的值,但仍然无法正常工作。 它给了我一些没有任何意义的垃圾数字。

我称之为:

 memsetFun(address, num, size); printf("value at %p is %dn", address, *((int*) address)); 

我在哪里拨打地址(我只是输入地址)

例如,如果要打印字符(c),它会打印出类似于奇怪的字符(对于值4)

 0 0 0 4 

    你的代码看起来很好,这里有几个人评论说它适用于他们的系统。

    因此,显而易见的事情就是调试它 – 这是一项将来会派上用场的技巧:-)你现在应该学习它。

    运行它时,以下代码输出了什么?

     void* memsetFun(void* pointer, int c, int size) { printf("A %x %d %dn", pointer, c, size); if ( pointer != NULL && size > 0 ) { printf("Bn"); unsigned char* pChar = pointer; int i = 0; for ( i = 0; i < size; ++i) { printf("C %d (%d)", i, *pChar); unsigned char temp = (unsigned char) c; *pChar++ = temp; // or pChar[i] = temp (they both don't work) printf(" -> (%d)", i, *(pChar-1)); } } printf("Dn"); return pointer; } 

    从输出中,应该清楚代码所采用的路径以及参数是什么(这将极大地帮助调试过程)。

    更新:

    如果你用零以外的任何东西填充你的内存块并使用它:

     printf("value at %p is %dn", address, *((int*) address)); 

    打印出来,你得到奇怪的结果。

    您基本上要求将这些字节的数量解释为整数。 因此,例如,如果你用0x02字节填充它并且你有一个4字节的整数类型,你将获得整数0x02020202 (33686018), 而不是你想象的0x02 。 如果要查看第一个字符值是什么,请使用:

     printf("value at %p is %dn", address, *((char*) address)); 

    并根据您的最新问题更新:

    例如,如果要打印字符(c),它会打印出类似于奇怪的字符(对于值4)
    0 0
    0 4

    如果那是一个单一的角色并且你将它打印成一个角色,那么可能根本就没有错。 许多输出流将为您提供控制字符(在本例中为CTRL-D,ASCII代码4)。 如果你用ASCII代码0x30(48)填充它,你会看到字符’0’或ASCII 0x41(65)会给你’A’。

    正如已经指出的那样,您的function可以正常工作。 这是一个完整的例子:

     #include  #include  void* memsetFun(void* pointer, int c, int size) { if ( pointer != NULL && size > 0 ) { unsigned char* pChar = pointer; int i = 0; for ( i = 0; i < size; ++i) { unsigned char temp = (unsigned char) c; *pChar++ = temp; // or pChar[i] = temp (they both don't work) } } return pointer; } int main() { // Your memset char a[10]; memsetFun(a, 'A', sizeof(a)); // Uses system memset for verification char b[10]; memset(b, 'A', sizeof(b)); assert(sizeof(a) == sizeof(b)); assert(memcmp(a, b, sizeof(b)) == 0); return 0; } 

    return p; 防止这种情况编译: p未定义。

    一个小的效率问题 – 在实践中它几乎没有效果,因为任何好的编译器都会重新排列它,但是编码完美主义者不会允许它保留 – 对temp的赋值在循环内部,但每次都是相同的赋值。 也就是说,可以在循环之前移动对temp的赋值。

    你返回p ,它没有定义/没有特别指向任何东西。 也许你的意思是pointer

    代码在逻辑上是正确的。 使用p => pointer更改它可以正常工作。

    澄清它是如何“不工作”的。 也许你不明白应该做什么?

    您可能正在获取垃圾编号,因为您正在从int(4个字节)转换为无符号字符(1个字节),因此如果c> 255或<0,您将不会记住您期望的值。

    如果你的程序设置值为0x01的5个元素的int向量的内存,我运行了一个测试。

    这里的问题是你在int的向量中迭代(例如4个字节),但是使用char指针算法(1个字节)迭代它。 例如,如果你想要memset 0x01,你将在向量中为每个值写下这个数字:00000001000000010000000100000001,它使用原始的memset给我相同的值。

    你的function对我有用。

    我想你错了。 我这样称呼它

     char a[100]; memsetFun(a, 0, sizeof a); int b[100]; memsetFun(b, 0, sizeof b); 

    你怎么称呼你的memsetFun()

    编辑

     int b[100]; memsetFun(b, 9, sizeof b); 

    因为int由4个字节组成(在我的系统上),每个值将被设置为0x09090909151587081

    这正是它应该做的。 你的function完美无缺。 值“0x4” 不是 ASCII字符“4”。

      以上就是c/c++开发分享编写memset函数时出现问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/519257.html

      (0)
      上一篇 2020年12月5日
      下一篇 2020年12月5日

      精彩推荐