//_alloca 实例返回 void 指向分配空间,以确保为任何类型的对象存储正确对齐。 如果 size 为 0, _alloca 分配一个零的项目并返回了有效的指针该项目。 //_alloca 从程序堆栈分配 size 字节。 该分配空间自动被释放,当调用函数退出时 (而不是,在将只是超出范围时)。 void test1() { int size = 1000; int errcode = 0; void *pData = NULL; if (size > 0 && size < 1024) { pData = _alloca( size ); printf_s( "Allocated %d bytes of stack at 0x%p", size, pData); } else { printf_s("Tried to allocate too many bytes.\n"); } }
alloca包含在头文件malloc.h中,在某些系统中会宏定义成_alloca使用。
注意:
1)在调用 alloca的函数返回的时候, 它分配的内存会自动释放。也就是说, 用 alloca 分配的内存在栈上。所以释放不需要用户使用free。
2)alloca不具可移植性,而且在没有传统堆栈的机器上很难实现。当它的返回值直接传入另一个函数时会带来问题,因为他分配在栈上.
总结:由于这些原因,alloca不宜使用在必须广泛移植的程序中, 不管它可能多么有用。
// realloc 重新分配内存块。 void test3() { long *buffer, *oldbuffer; size_t size; if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL ) exit( 1 ); size = _msize( buffer ); printf_s( "Size of block after malloc of 1000 longs: %u\n", size ); // Reallocate and show new size: oldbuffer = buffer; // save pointer in case realloc fails if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) )) == NULL ) { free( oldbuffer ); // free original block exit( 1 ); } size = _msize( buffer ); printf_s( "Size of block after realloc of 1000 more longs: %u\n", size ); free( buffer ); }
realloc:
重新分配内存并返回void类型,如果没有足够的内存扩展内存块,则原来的指向的内存指针无变化,并返回NULL;如果重新分配大小设为0,而释放原来的内存块, 并返回NULL。
//calloc 返回指向该分配空间。 存储空间指向返回值以确保为任何类型的对象存储正确对齐。 获取对一个类型的指针 void除了之外,将使用一个返回值的类型转换 // void test2() { long *buffer; buffer = (long *)calloc( 40, sizeof( long ) ); if( buffer != NULL ) printf( "Allocated 40 long integers\n" ); else printf( "Can't allocate memory\n" ); free( buffer ); }
calloc:
分配指定数目的元素,每个元素的大小由size指定, 并将其初始化为0,calloc调用malloc使用C++ _set_new_mode函数来设置新的处理方式,默认情况下,malloc 失败时不调用分配内存的处理程序例程。
//如果内存充足,则 malloc 返回无效的指针给分配的空间或 NULL。 若要返回指向类型的指针而不是 void,请对返回值使用类型转换。
//返回值指向的存储空间保证适合储存任何类型的对象,该对象有一个相对于基本对齐方式,更少或同样的对齐方式要求。
//如果内存充足,则 malloc 返回无效的指针给分配的空间或 NULL。 若要返回指向类型的指针而不是 void,请对返回值使用类型转换。 //返回值指向的存储空间保证适合储存任何类型的对象,该对象有一个相对于基本对齐方式,更少或同样的对齐方式要求。 void test4() { char *string; // Allocate space for a path name string = malloc( _MAX_PATH ); // In a C++ file, explicitly cast malloc's return. For example, // string = (char *)malloc( _MAX_PATH ); if( string == NULL ) printf( "Insufficient memory available\n" ); else { printf( "Memory space allocated for path name\n" ); free( string ); printf( "Memory freed\n" ); } }
malloc:
从堆上分配指定大小的字节数并返回void类型,如分配失败则返回NULL,malloc分配的字节数可能比指定的字节要多,这是由内存对齐方式决定的,malloc实际上调用了HeapAlloc函数, 因此malloc分配的内存也不能跨进程调用。