这种用法出了什么问题
void* buffer ;
buffer = (void *)malloc(4096) ;
memset( buffer, 0, sizeof(buffer) );
int *data = static_cast<int*>(buffer) ;
for(int i=0 ; i<10 ; i++)
{
cout<< data[i] << "\n" ;
}
我在输出中得到垃圾值。我使用memset错了吗?
答案 0 :(得分:1)
sizeof(buffer)
返回void*
的大小(void指针的大小)。这与内存块的大小无关。
void*
的大小通常为4或8个字节,但这取决于平台。所以memset()
只清除数组开头的几个字节。要清除所有这些,您必须传入数组的确切大小(以字节为单位)。在这种情况下4096。
sizeof
实际上会返回内存块的大小(如果它是静态分配的块,例如char buffer[4096]
)。请记住,sizeof
在编译时解析。因此静态数组是编译器可以解析数组长度的唯一情况。使用动态分配的数组,编译器无法知道大小。无论数组数据类型char*
,int*
,std::string*
如何,在指针上调用sizeof
将始终返回指针变量的大小,而不是内存的大小它指向。
答案 1 :(得分:0)
正如glampert已经回答的那样,问题是sizeof(缓冲区)不表示分配的内存量,而是表示指针的大小。所以你可以写一下
const int size = 4096;
void* buffer = malloc(size);
memset( buffer, 0, size );
int *data = static_cast<int*>(buffer) ;
for(int i=0 ; i<10 ; i++)
{
cout<< data[i] << "\n" ;
}
free( buffer );
另一种方式perhaps a bit faster将是
const int size = 4096;
void* buffer = calloc(size); // return a newly allocated memory block which is zeroed
int *data = static_cast<int*>(buffer) ;
for(int i=0 ; i<10 ; i++)
{
cout<< data[i] << "\n" ;
}
free( buffer );
但是既然你正在使用C ++,那么这样做可能更合适:
int *data = new int[ 10 ];
for ( int i=0; i < 10; i++ ) {
data[ i ] = 0;
}
for( int i=0; i < 10; i++ ) {
cout<< data[i] << "\n" ;
}
delete [] data;
甚至更好:
int *data = new int[ 10 ](); // allocated array will be zeroed out
for( int i=0; i < 10; i++ ) {
cout<< data[i] << "\n" ;
}
delete [] data;