std::memset功能
memset(void* a,int b,int c)
a表示初始化的对象 b表示初始化值 c表示初始化字节数
memset的方便之处在于可以将复杂的数据结构简洁得初始化
初始化数组
int main() {
int buffer[10];
int n = 10;
int charTemp = 1;
int position = 0;
int arg = 0;
for (int i = 0;i < n;i++) {
std::memset(buffer, arg, sizeof(int) * 10);
buffer[position] = charTemp++;
for (auto& e : buffer) {
std::cout << e << " ";
}
std::cout << "\n";
}
return 0;
}
初始化集合
int main() {
std::vector<int> buffer(10, 2);
int n = 10;
int charTemp = 1;
int position = 0;
int arg = 0;
for (int i = 0;i < n;i++) {
std::memset(buffer.data(), arg, sizeof(int) * buffer.size());
buffer[position] = charTemp++;
for (auto& e : buffer) {
std::cout << e << " ";
}
std::cout << "\n";
}
return 0;
}
初始化对象
int main() {
struct Person {
int age = 20;
std::string name = "GG";
};
Person firstPerson;
std::memset(&firstPerson, 0, sizeof(struct Person));
firstPerson.age = 10;
Person secondPerson;
std::memset(&secondPerson, 0, sizeof(struct Person));
secondPerson.name = "G";
std::cout << " firstPerson.age " << firstPerson.age << " firstPerson.age " << firstPerson.name << "\n";
std::cout << " secondPerson.age " << secondPerson.age << " secondPerson.name " << secondPerson.name << "\n";
return 0;
}
std::memset的坑
memset一般只用于初始化不能用于字符替代转换
如
int main() {
int buffer[10];
int n = 10;
int charTemp = 1;
int position = 0;
int arg = 1;
for (int i = 0;i < n;i++) {
std::memset(buffer, arg, sizeof(int) * 10);
buffer[position] = charTemp++;
for (auto& e : buffer) {
std::cout << e << " ";
}
std::cout << "\n";
}
return 0;
}
具体原理我也是论坛学习的,下面贴图,感谢这位朋友
也感谢这篇博文的发布者:https://blog.csdn.net/qq_42592097/article/details/81947072
第三个参数
项目文件读取时候,有朋友可能会这么写
std::ifstream is(filename);
std::vector<char> buffer(1024, 0);
while (!is.eof()) {
std::memset(buffer.data(), 0, buffer.capacity());
...
}
这里buffer.capacity()是可以的,因为本来char是一个字节,但是实际应该是sizeof(char)*buffer.capacity()
一般写作sizeof(buffer)即可
来源:https://blog.csdn.net/niu99k/article/details/99288631