有人可以向我解释为什么这不起作用吗?我没有得到任何分段错误。它编译我什么也没得到。
#include <iostream>
#include <cstdlib>
#include <cstring>
int main(){
void *buffer = new char[8];
memset( (char*)&buffer, 'a', sizeof(buffer) );
std::cout << (char*)buffer <<std::endl;
return 0;
}
答案 0 :(得分:3)
我看到以下问题。
问题1
memset( (char*)&buffer, 'a', sizeof(buffer) );
这是传递给memset
的错误地址。你需要使用:
memset( buffer, 'a', sizeof(buffer) );
问题2
sizeof(buffer)
计算指针的大小(32位平台为4,64位平台为8)。您需要使用数组的长度,即8
。
memset( buffer, 'a', 8 );
问题3
std::cout << (char*)buffer <<std::endl;
仅当buffer
是以空字符结尾的字符串时,才会起作用。如果您使用memset
,则所有有效内存都将设置为a
。因此,字符串不会以空值终止。
您需要确保buffer
为空终止。
buffer[7] = '\0';
std::cout << buffer <<std::endl; // No need for explicit cast
答案 1 :(得分:0)
您复制到buffer
的地址。但buffer
保存缓冲区的地址。所以你要复制到地址的地址。
<<
上的char *
运算符仅适用于C风格的字符串。您不能在不是字符串的任意字符数组上使用它。如何知道要输出多少个字符?
sizeof
运算符只会告诉您类型的大小。
答案 2 :(得分:-1)
无效指针非常棘手,通常不会使用。我只是使它成为一个char *指针,而不是使用缓冲区的引用。指针的名称是整个内存位置的引用。
以下是memset函数的一个很好的参考:http://www.cplusplus.com/reference/cstring/memset/
祝你好运。看起来你大部分都在工作。