_expand
Mengubah ukuran blok memori.
Sintaks
void *_expand(
void *memblock,
size_t size
);
Parameter
memblock
Pointer ke blok memori yang dialokasikan sebelumnya.
size
Ukuran baru dalam byte.
Nilai hasil
_expand
mengembalikan penunjuk ke blok memori yang dialokasikan. _expand
, tidak seperti realloc
, tidak dapat memindahkan blok untuk mengubah ukurannya. Dengan demikian, jika ada cukup memori yang tersedia untuk memperluas blok tanpa memindahkannya, memblock
parameter _expand
ke sama dengan nilai yang dikembalikan.
_expand
NULL
mengembalikan ketika kesalahan terdeteksi selama operasinya. Misalnya, jika _expand
digunakan untuk menyusutkan blok memori, itu mungkin mendeteksi kerusakan di tumpukan blok kecil atau penunjuk blok yang tidak valid dan mengembalikan NULL
.
Jika tidak ada cukup memori yang tersedia untuk memperluas blok tanpa memindahkannya, fungsi akan mengembalikan NULL
. _expand
tidak pernah mengembalikan blok yang diperluas ke ukuran yang kurang dari yang diminta. Jika kegagalan terjadi, errno
menunjukkan sifat kegagalan. Untuk informasi selengkapnya tentang errno
, lihat errno
, , _sys_errlist
_doserrno
, dan _sys_nerr
.
Nilai pengembalian menunjuk ke ruang penyimpanan yang cocok diselaraskan untuk penyimpanan jenis objek apa pun. Untuk memeriksa ukuran baru item, gunakan _msize
. Untuk mendapatkan penunjuk ke jenis selain void
, gunakan jenis cast pada nilai yang dikembalikan.
Keterangan
Fungsi mengubah _expand
ukuran blok memori yang dialokasikan sebelumnya dengan mencoba memperluas atau mengontrak blok tanpa memindahkan lokasinya di timbunan. Parameter memblock
menunjuk ke awal blok. Parameter size
memberikan ukuran baru blok, dalam byte. Konten blok tidak berubah hingga lebih pendek dari ukuran baru dan lama. memblock
seharusnya bukan blok yang telah dibebaskan.
Catatan
Pada platform 64-bit, _expand
mungkin tidak mengontrak blok jika ukuran baru kurang dari ukuran saat ini; khususnya, jika ukuran blok kurang dari 16K dan oleh karena itu dialokasikan dalam Tumpukan Fragmentasi Rendah, _expand
membuat blok tidak berubah dan mengembalikan memblock
.
Ketika aplikasi ditautkan dengan versi debug pustaka run-time C, _expand
diselesaikan ke _expand_dbg
. Untuk informasi selengkapnya tentang bagaimana tumpukan dikelola selama proses debugging, lihat Tumpukan debug CRT.
Fungsi ini memvalidasi parameternya. Jika memblock
adalah penunjuk null, fungsi ini memanggil handler parameter yang tidak valid, seperti yang dijelaskan dalam Validasi parameter. Jika eksekusi diizinkan untuk melanjutkan, errno
diatur ke EINVAL
dan fungsi mengembalikan NULL
. Jika size
lebih besar dari _HEAP_MAXREQ
, errno
diatur ke ENOMEM
, dan fungsi mengembalikan NULL
.
Secara default, status global fungsi ini dicakup ke aplikasi. Untuk mengubah perilaku ini, lihat Status global di CRT.
Persyaratan
Fungsi | Header yang diperlukan |
---|---|
_expand |
<malloc.h> |
Untuk informasi kompatibilitas selengkapnya, lihat Kompatibilitas.
Contoh
// crt_expand.c
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
int main( void )
{
char *bufchar;
printf( "Allocate a 512 element buffer\n" );
if( (bufchar = (char *)calloc( 512, sizeof( char ) )) == NULL )
exit( 1 );
printf( "Allocated %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
if( (bufchar = (char *)_expand( bufchar, 1024 )) == NULL )
printf( "Can't expand" );
else
printf( "Expanded block to %d bytes at %Fp\n",
_msize( bufchar ), (void *)bufchar );
// Free memory
free( bufchar );
exit( 0 );
}
Allocate a 512 element buffer
Allocated 512 bytes at 002C12BC
Expanded block to 1024 bytes at 002C12BC