Malloc Memset是这个用法吗?

时间:2014-04-25 19:15:57

标签: c++ malloc memset static-cast

这种用法出了什么问题

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错了吗?

2 个答案:

答案 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;