memset
函数功能
将指定值填充到内存区域的每个字节。通常用于初始化或清空内存区域。
函数定义
void *memset(void *ptr, int value, size_t num);
参数说明
参数名 |
描述 |
取值范围 |
输入/输出 |
|---|---|---|---|
ptr |
指向用于存储重置内容的目标内存指针。 |
非空指针,指向有效内存,至少有num字节可访问。 |
输入/输出 |
value |
重置的目标值。 |
实际会被转换为unsigned char,有效范围为0~255(超过则截断) |
输入 |
num |
被重置的字节数。 |
非负数,不超过ptr指向的内存大小。 |
输入 |
返回值
- 成功:返回指向目标存储区内存的指针,返回值一般被忽略。
- 失败:遵循开源Glibc,不返回特殊异常值。
主要用于初始化内存(如将内存设置为0或其他值)或清空数据。由于使用ZVA指令优化清零操作,因此需要注意系统ZVA块的大小。
对于memset内存清零操作,目前仅支持系统DC ZVA块大小为64B的场景,验证方法请参见ZVA块测试。
ZVA块测试
#include <stdio.h>
#include <stdint.h>
int main() {
uint64_t dczid;
// 使用内联汇编读取dczid_el0
asm volatile("mrs %0, dczid_el0" : "=r"(dczid));
if (dczid & 0x10) {
printf("DC ZVA not supported.\n");
} else {
uint32_t bs = dczid & 0xF;
uint32_t size = 1 << (bs + 2); // 块大小 = 2^(bs+2) 字节
printf("DC ZVA block size: %u bytes\n", size);
}
return 0;
}
编译并执行上述内容。
gcc test_zva.c -o test_zva ./test_zva
运行结果如下所示。
DC ZVA block size: 64 bytes
示例
#include <stdio.h>
#include <string.h>
int main() {
char byteArr[10];
memset(byteArr, 'A', sizeof(byteArr));
for(int i = 0; i < sizeof(byteArr); i++) {
printf("%c ", byteArr[i]);
}
printf("\n");
return 0;
}
运行结果:
A A A A A A A A A A
父主题: 函数定义