这种用法有什么问题
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" ;
}
我在输出中得到垃圾值。我用错内存集了吗?
sizeof(buffer)
将返回void*
的大小(空指针的大小)。这与内存块的大小无关。
void*
的大小通常为4或8个字节,但这取决于平台。所以memset()
只清除数组开头的几个字节。要清除所有这些,必须传入数组的确切大小(以字节为单位)。在这种情况下为4096。
如果sizeof
是静态分配的块,例如char buffer[4096]
,那么它实际上会返回内存块的字节大小。请记住,sizeof
是在编译时解析的。因此,当编译器能够解析数组的长度时,静态数组是唯一的情况。对于动态分配的数组,编译器无法知道其大小。无论数组数据类型为char*
、int*
、std::string*
,在指针上调用sizeof
都将始终返回指针变量的大小,而不是它所指向的内存的大小。
正如glampert已经回答的那样,问题是sizeof(buffer)不是表示分配的内存量,而是表示指针的大小。所以你可以写
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 );
另一种可能更快的方式是
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;