Malloc Memset就是这种用法



这种用法有什么问题

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;

相关内容

  • 没有找到相关文章

最新更新