_expand
Bellek bloğunun boyutunu değiştirir.
Sözdizimi
void *_expand(
void *memblock,
size_t size
);
Parametreler
memblock
Önceden ayrılmış bellek bloğu işaretçisi.
size
Bayt cinsinden yeni boyut.
Dönüş değeri
_expand
yeniden ayrılan bellek bloğuna geçersiz bir işaretçi döndürür. _expand
, aksine realloc
, boyutunu değiştirmek için bir bloğu taşıyamaz. Bu nedenle, bloğu taşımadan genişletmek için yeterli bellek varsa parametresi _expand
dönüş memblock
değeriyle aynıdır.
_expand
, işlemi sırasında bir hata algılandığında döndürür NULL
. Örneğin, bir bellek bloğunu küçültmek için kullanılırsa _expand
, küçük blok yığınında veya geçersiz bir blok işaretçisinde bozulma algılayıp döndürebilir NULL
.
Bloğu taşımadan genişletmek için yeterli bellek yoksa işlev döndürür NULL
. _expand
hiçbir zaman istenenden daha küçük bir boyuta genişletilmiş bir bloğu döndürmez. Bir hata oluşursa, errno
hatanın doğasını gösterir. hakkında errno
daha fazla bilgi için bkz.errno
, _doserrno
, _sys_errlist
ve _sys_nerr
.
Dönüş değeri, herhangi bir nesne türünün depolaması için uygun olan bir depolama alanını gösterir. Öğenin yeni boyutunu denetlemek için kullanın _msize
. dışında void
bir türe işaretçi almak için dönüş değerinde tür tür ataması kullanın.
Açıklamalar
İşlev, _expand
yığının konumunu taşımadan bloğu genişletmeye veya daraltmaya çalışarak daha önce ayrılmış bir bellek bloğunun boyutunu değiştirir. memblock
parametresi bloğun başlangıcını gösterir. size
parametresi bloğun yeni boyutunu bayt cinsinden verir. Bloğun içeriği, yeni ve eski boyutların en kısasına kadar değiştirilmez. memblock
serbest bırakılmış bir blok olmamalıdır.
Not
64 bit platformlarda, _expand
yeni boyut geçerli boyuttan küçükse, bloğun boyutu 16.000'den küçükse ve bu nedenle Düşük Parçalanma Yığınında ayrılmışsa, _expand
bloğu değişmeden bırakır ve döndürür memblock
.
Uygulama C çalışma zamanı kitaplıklarının hata ayıklama sürümüyle bağlandığında, _expand
olarak _expand_dbg
çözümlenir. Yığın hata ayıklama işlemi sırasında nasıl yönetilir hakkında daha fazla bilgi için bkz . CRT hata ayıklama yığını.
Bu işlev parametrelerini doğrular. Boş bir işaretçiysememblock
, bu işlev Parametre doğrulama bölümünde açıklandığı gibi geçersiz bir parametre işleyicisi çağırır. Yürütmenin devam etmesi için izin verilirse, errno
olarak ayarlanır EINVAL
ve işlevi döndürür NULL
. değerinden büyüksesize
, olarak ENOMEM
ayarlanır ve işlevi döndürürNULL
._HEAP_MAXREQ
errno
Varsayılan olarak, bu işlevin genel durumunun kapsamı uygulama olarak belirlenmiştir. Bu davranışı değiştirmek için bkz. CRT'de Genel durum.
Gereksinimler
İşlev | Gerekli başlık |
---|---|
_expand |
<malloc.h> |
Daha fazla uyumluluk bilgisi için bkz . Uyumluluk.
Örnek
// 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