Kor*_*ray 15 c++ arrays memset null-terminated c++11
使用null终止字符memset整个字符数组的正确和最安全的方法是什么?我可以列出一些用法:
...
char* buffer = new char [ARRAY_LENGTH];
//Option 1: memset( buffer, '\0', sizeof(buffer) );
//Option 2 before edit: memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH );
//Option 2 after edit: memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH );
//Option 3: memset( buffer, '\0', ARRAY_LENGTH );
...
Run Code Online (Sandbox Code Playgroud)
Dir*_*ple 20
选项一和二是错误的.第一个使用指针的大小而不是数组的大小,因此它可能不会写入整个数组.第二个使用sizeof(char*)而不是sizeof(char)它将写入数组的末尾.选项3没问题.你也可以用这个
memset( buffer, '\0', sizeof(char)*ARRAY_LENGTH );
Run Code Online (Sandbox Code Playgroud)
但sizeof(char)保证是1.
Luc*_*ore 13
惯用的方法是初始化数组:
char* buffer = new char [ARRAY_LENGTH]();
Run Code Online (Sandbox Code Playgroud)
选项1仅将第一个sizeof(char*)字节设置为0,否则将遇到未定义的行为ARRAY_LENGHT < sizeof(char*).
选项2会遇到未定义的行为,因为您尝试设置的字节数超过ARRAY_LENGTH个字节. sizeof(char*)几乎可以肯定大于1.
既然这是C++(newC中没有),我建议你std::string改用.
对于C(假设malloc代替new[]),您可以使用
memset( buffer, 0, ARRAY_LENGTH );
Run Code Online (Sandbox Code Playgroud)
由于问题不断变化,我定义:
1: memset( buffer, '\0', sizeof(buffer) );
2A: memset( buffer, '\0', sizeof(char*) * ARRAY_LENGTH );
2B: memset( buffer, '\0', sizeof(char) * ARRAY_LENGTH );
3: memset( buffer, '\0', ARRAY_LENGTH );
如果问题仅仅是"调用的正确方法是什么memset"而不是"将这个数组归零的最佳方法",则2b或3是正确的.1和2a是错误的.
你可以在2b和3之间进行一场风格大战:无论是否包括sizeof(char)- 有些人因为冗余(我通常这样做)而将其排除在外,其他人则将其置于与相同代码设置的一致性中数组int.也就是说,它们总是将大小乘以一些元素,即使它们知道大小为1.一个可能的结论是memset数组指向的"最安全"的方法buffer是:
std::memset(buffer, 0, sizeof(*buffer) * ARRAY_LENGTH);
Run Code Online (Sandbox Code Playgroud)
如果缓冲区的类型发生变化,此代码仍然是正确的,前提是它继续具有ARRAY_LENGTH任何类型的元素,并且假设所有位零都保持正确的初始值.
"C++不是C"程序员所钟爱的另一个选择是:
/* never mind how buffer is allocated */
std::fill(buffer, buffer + ARRAY_LENGTH, 0);
Run Code Online (Sandbox Code Playgroud)
如果您在意,您可以自己检查您的编译器是否将其优化为与其优化等效调用的相同代码std::memset.
char *buffer = new char [ARRAY_LENGTH]();在实践中,C++很漂亮但几乎无用,因为你几乎从不new在第一时间分配数组.
std::string buffer(ARRAY_LENGTH, 0);介绍了一种管理缓冲区的特殊方法,它可能是你想要的,也可能不是你想要的.有很多关于可说char buffer[ARRAY_LENGTH] = {0};在某些情况下.
| 归档时间: |
|
| 查看次数: |
71346 次 |
| 最近记录: |