【问题标题】:Is this the correct way to use memset() in C? [closed]这是在 C 中使用 memset() 的正确方法吗? [关闭]
【发布时间】:2021-12-11 09:46:07
【问题描述】:

所以一开始我是 C 的菜鸟,并且正在学习内存操作。我有一个名为void* buffer 的缓冲区。然后我想将一个整数放入该缓冲区的前 4 个字节(因为 int 是 4 个字节,但如果我错了,请纠正我)。我会这样做吗:

memset(buffer, '9', sizeof(int))

如果我要以错误的方式填充前 4 个字节,请随时纠正我。

【问题讨论】:

  • 运行这段代码时缓冲区发生了什么?您需要有一些方法来验证您写入缓冲区的内容,例如一个实用函数来打印每个字节的十六进制值,否则你将很难学习。这将向您展示为什么此代码不符合您的要求。此外,“9”(字符)与 9(整数)完全不同。
  • 两次没有。 (1) 我猜buffer 还没有指向任何地方。 (但如果确实如此,请向我们展示您如何声明 buffer,以及如何将其设置为指向某个位置。) (2) memset 仅适用于将区域的每个字节设置为某个值,因此它通常仅适用于(a) 将字符串的所有字符设置为相同的字符,或 (b) 将数据结构的所有字节设置为 0。如果要设置整数数组的第一个整数,则宁愿使用 buffer[0] = 9; (虽然这不适用于void *buffer)。
  • @SteveSummit 你正确的缓冲区没有指向任何地方,我只是将它用作一个数组来存储整数和字符,但我希望它们在内存中完全相邻。所以从你的解释看来我不想使用 memset。
  • @John 你更大的问题是,如果buffer 没有指向任何地方,但你不能将它用于任何东西。 (除非你这样做,否则没有人会为其分配内存。)
  • @SteveSummit 我只是使用缓冲区作为数据包将数据从客户端传输到服务器。但我希望我的“数据包”从内存地址 0x01 开始从前面填充,因为 0x00 为 NULL,并且不跳过数据包条目之间的任何字节。

标签: c memory memset


【解决方案1】:

阅读文档

#include <string.h>
void *memset(void *s, int c, size_t n);

描述 memset() 函数用常量字节c 填充s 指向的内存区域的第一个n 字节。返回 值 memset() 函数返回指向内存区域的指针 s.

所以你打电话给memset

memset(buffer, '9', sizeof(int))

将用数字'9'的ASCII码填充buffer引用的内存字节sizeof(int)

【讨论】:

    猜你喜欢
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 2020-02-14
    • 2013-07-20
    • 2012-05-11
    • 2018-12-31
    • 2021-04-29
    相关资源
    最近更新 更多