C语言中free、malloc 等内存管理函数

染色体外环状DNA:肿瘤研究新方向 染色体外环状DNA(ecDNA)是癌症中活化原癌基因扩增的主要方式。区别于常染色体,这类生物大分子主要以环状的形式存在于细胞核当中,长度分布在103-106数量级,无中心粒。ecDNA序列中包含一个或者多个基因与调控元件,结构开放,转录活性强,相比于在棒状染色体结构基因,ecDNA的生物功能活性更强。癌症中,成环的基因区域拷贝数往往增高,而超过一半的高拷贝数事件是ecDNA驱动生成。... 阅读详情

原文 双宿双飞的 malloc 和 free,优快云同步发布。

转载请注明出处,谢谢!


简介

函数 malloc 和 free 是一对好朋友,几乎是形影不离。有 malloc 的地方就应该有 free 的存在。

今天跟大家聊聊 malloc 和 free 这对好基友,这两个函数都是对堆内存进行管理的函数,另外还有 calloc、realloc、reallocf、valloc 等堆内存管理函数。

强力推荐-不要错过,万一能帮助到自己呢?

朋友做了一个关于 人工智能的教程,教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!点 这里 可以跳转到教程,对人工智能感兴趣的朋友可以去了解一下。

void *

在进行下面话题之前,我们先回忆一下 void * 是什么?

void * 表示未确定类型的指针。C/C++ 规定,void * 类型可以强制转换为任何其它类型的指针。

void * 也被称之为无类型指针,void * 可以指向任意类型的数据,就是说可以用任意类型的指针对 void * 赋值,如下示例:

void *p1;
int *p2;
p1 = p2;

但一般不会反过来使用,如下示例在有些编译器上面可以编译通过,有些就不行:

void *p1;
int *p2;
p2 = p1;

可以修改一下代码,将 void * 转换为对应的指针类型再进行赋值,如下示例:

void *p1;
int *p2;
p2 = (char *)p1;

由于 GNU 和 ANSI 对 void * 类型指针参与运算的规定不一样,所以为了兼容二者并且让程序有更好的兼容性,最好还是将 void * 转换为有明确类型的指针再参与运算,如下示例。

void *pd;
char *pc = (char *)pd;
pc ++;
pc += 1;

malloc

函数原型:

void * malloc(size_t size);

malloc 向系统申请分配指定 size 个字节的内存空间,即 malloc 函数用来从堆空间中申请指定的 size 个字节的内存大小,返回类型是 void * 类型,如果成功,就会返回指向申请分配的内存,否则返回空指针,所以 malloc 不保证一定成功。

查看函数手册或者直接在 Linux、macOS 等 Unix 系统上面直接 man malloc 会显示对应的函数信息:

The malloc() function allocates size bytes of memory and returns a pointer to the allocated memory.

If successful, malloc() function return a pointer to allocated memory.  
If there is an error, they return a NULL pointer and set errno to ENOMEM.

另外需要注意一个问题,使用 malloc 函数分配内存空间成功后,malloc 不会对数据进行初始化,里边数据是随机的垃圾数据,所以一般结合 memset 函数和 malloc 函数 一起使用。

int *arr;
arr = (int *)malloc(10 * sizeof(int));
if (NULL != arr) {
    memset(arr, 0, 10 * sizeof(int));
    printf("arr: %p\n", arr);
}

为了安全起见,建议可以考虑使用 calloc() 函数,文中的后面会提到它。

函数 free、malloc、calloc() 都被包含在 stdlib.h 头文件中,当然了 malloc.h 头文件也有对应的函数声明,实现在 malloc.c 文件中。

关于 malloc 函数中的 size 参数务必要大于指针本身的数值,在 32 位操作系统上,指针占用4字节的大小;在 64 位操作系统上,指针占用8字节的大小。

free

函数原型:

void free(void *ptr);

我们知道在 C 语言中, 堆上的内存空间不会自动释放(Java 有自动回收机制,而 C 语言没有),直到调用 free 函数,才会释放堆上的存储空间,即 free 函数会释放指针指向的内存分配空间。

下面是函数手册查到关于 free 函数的资料:

The free() function deallocates the memory allocation pointed to by ptr.
If ptr is a NULL pointer, no operation is performed.

对于 free 函数我们要走出一个误区,不要以为调用了 free 函数,变量就变为 NULL 值了。本质是 free 函数只是割断了指针所指的申请的那块内存之间的关系,并没有改变所指的地址(本身保存的地址并没有改变)。如下示例:

char *pchar = (char *)malloc(10 * sizeof(char));
        
if (NULL != pchar) {
    strcpy(pchar, "blog");
    /* pchar所指的内存被释放,但是pchar所指的地址仍然不变 */
    free(pchar);
    
    /* 该判断没有起到防错作用,此时 pchar 并不为 NULL */
    if (NULL != pchar) {
        strcpy(pchar, "it");
        printf("pchar: %s", pchar);
    }
}

正确且安全的做法是对指针变量先进行 free 然后再将其值置为 NULL,如下下面示例:

char *pchar = (char *)malloc(10 * sizeof(char));
        
if (NULL != pchar) {
    strcpy(pchar, "blog");
    /* pchar所指的内存被释放,但是pchar所指的地址仍然不变 */
    free(pchar);
    /* 将其置为 NULL 值 */
    pchar = NULL;
    
    /* 该判断没有起到防错作用,此时 pchar 并不为 NULL */
    if (NULL != pchar) {
        strcpy(pchar, "it");
        printf("pchar: %s", pchar);
    }
}

函数 free 只能释放 alloc 的内存空间,对于其他非 alloc 的指针变量使用 free 会出现错误,如下面的例子:

int a = 0x2010;
int *p;
p = &a;
free(p);

运行后程序直接跪了,报类似下面的错误信息:

pointer being freed was not allocated.

另外再告诉大家一个秘密,free 一个空指针没问题。如下例子:

int *p;
p = NULL;
free(p);

代码可以正常运行,在 free 函数源码为证:

/* free(0) has no effect */
if (mem == 0){
	return;   
}

而 NULL 在源码(在 morecore.c 文件中)中定义就是 0,如下:

#ifndef NULL
# define NULL 0
#endif

malloc、free 小结

1、连续内存块

malloc 函数申请的是连续的一块内存,如果所申请的内存块大于目前堆上剩余内存块,则内存分配会失败,函数返回 NULL 值。

注意:上面说的 堆上剩余内存块 不是所有剩余内存块之和,而是连续的内存。

2、双宿双飞才好

调用 malloc 函数后多次调用 free 函数会发生内存泄漏。调用 malloc 函数少于 free 函数,肯定会出错。换句话说,在程序中 malloc 的使用次数务必要和 free 相等,否则必有隐患或者发生错误。

如下面的例子 free 两次指针变量就会在运行时报错: malloc: *** error for object 0x10071be90: pointer being freed was not allocated,也称之为 double free。

char *pchar = (char *)malloc(10 * sizeof(char));
free(pchar);
free(pchar);

对指针变量进行 free 之后,一定要记得对其赋值为 NULL,否则该指针就是一个野指针,这个在上面已经说明。

3、0字节的内存有毒

使用 malloc 函数也可以申请 0 字节的内存,该函数的返回值并不是 NULL,而是返回一个正常的内存地址,所以如果使用这种方式申请的内存很危险,如下面的例子,指针 pchar 是一个使用 malloc 函数创建的占用 0 字节的内存空间的一个指针变量,if (NULL == pchar) 并没有生效,而是执行了 else 语句中的代码。

char *pchar = (char *)malloc(0);
if (NULL == pchar) {
    printf("malloc 0 byte memory failed.\n");
} else {
    printf("malloc 0 byte successfully and pchar: %s.\n", pchar);
}

这中方式的指针类似于一个野指针,可以使用但有风险,不知道这个指针后面的内存空间被谁使用着,要是被核心进程使用,会造成相应程序的崩溃。

4、调皮的free

使用非 alloc 方式创建的内存,使用 free 函数会报错,这个要注意。另外,free 空指针没有影响。

calloc、realloc、reallocf、valloc

1、calloc 函数

void * calloc(size_t count, size_t size);

在堆上,分配 n*size 个字节,并初始化为0,返回 void *类型,返回值情况跟 malloc 一致。

函数 malloc() 和函数 calloc() 的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由 malloc() 函数分配的内存空间原来没有被使用过,则其中的每一位可能都是 0;反之,如果这部分内存曾经被分配过,则其中可能遗留有各种各样的数据。也就是说,使用 malloc() 函数的程序开始时(内存空间还没有被重新分配)能正常进行,但经过一段时间(内存空间还已经被重新分配)可能会出现问题。

函数 calloc() 会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为 0;如果你是为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。

The calloc() function contiguously allocates enough space for count objects that are size bytes of memory each and returns a pointer to the allocated memory.

The allocated memory is filled with bytes of value zero.

2、realloc() 函数

void * realloc(void *ptr, size_t size);

realloc() 会将 ptr 所指向的内存块的大小修改为 size,并将新的内存指针返回。假设之前内存块的大小为 n,如果 size <= n,那么截取的内容不会发生变化,如果 size > n,那么新分配的内存不会被初始化。

对于上面说的新的内存指针地址可能变也可能不变,假如原来 alloc 的内存后面还有足够多剩余内存的话,realloc 后的内存=原来的内存+剩余内存,realloc 还是返回原来内存的地址即不会创建新的内存。假如原来 alloc 的内存后面没有足够多剩余内存的话,realloc 将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被 free 掉,realloc 返回新内存的地址。

另外要注意,如果 ptr = NULL,那么相当于调用 malloc(size);如果 ptr != NULL 且 size = 0,那么相当于调用 free(ptr)。

当调用 realloc 失败的时候,返回 NULL,并且原来的内存不改变,不会释放也不会移动。

The realloc() function tries to change the size of the allocation pointed to by ptr to size, and returns ptr. 

If there is not enough room to enlarge the memory allocation pointed to by ptr, realloc() creates a new allocation, copies as much of the old data pointed to by ptr as will fit to the new allocation, frees the old allocation, and returns a pointer to the allocated memory.  

If ptr is NULL, realloc() is identical to a call to malloc() for size bytes.  

If size is zero and ptr is not NULL, a new, minimum sized object is allocated and the original object is freed.  

When extending a region allocated with calloc(3), realloc(3) does not guarantee that the additional memory is also zero-filled.

看一下源码的关键部分,如下:

void * __libc_realloc (void *oldmem, size_t bytes)
{
	// 省略... 
	
#if REALLOC_ZERO_BYTES_FREES
  	if (bytes == 0 && oldmem != NULL) {
    	__libc_free (oldmem); return 0;
    }
#endif

	// 省略...
}

这里可以看出,如果 oldmem 不为 NULL 且 bytes 为 0 的情况下,会自动进行 free 操作。如下面的例子运行后会报错。

#include <stdlib.h>
#include <stdio.h> 

int main()
{
    char *pre_ptr = (char *)malloc(20);
    int bytes = 0;
    if(NULL != pre_ptr) {
        void *ptr = realloc(pre_ptr, bytes);
        // 对pre_ptr进行了double free,这种条件下源码中会进行一次free
        free(pre_ptr);
    }
	
    return 0;
}

所以为了保险起见,要对 bytes 进行判断再做处理。

传递给 realloc 的指针变量必须是先前通过 malloc()、 calloc() 或 realloc() 等 alloc 分配的,否则会报 pointer being realloc'd was not allocated. 错误。如下例子(运行直接报错):

char *p = "";
void *newP = realloc(p, 10);

3、reallocf() 函数

void * reallocf(void *ptr, size_t size);

reallocf() 函数是由 FreeBSD 实现的,它会在任何情况下释放输入的指针(即使是再分配失败之后)。reallocf() 一样会调用 realloc 函数,但是只有我们在获得空的指针之后才会调用 free 函数。

下面是 reallocf 函数具体的实现部分:

void * reallocf(void *p, size_t size) 
{
    void *ptr = realloc(p, size);
    if (!p) {
        free(p);
    }
    return ptr;
}
The reallocf() function is identical to the realloc() function, except that it will free the passed pointer when the requested memory cannot be allocated.

This is a FreeBSD specific API designed to ease the problems with traditional coding styles for realloc causing memory leaks in libraries.

4、valloc() 函数

void * valloc(size_t size);

这个函数是最少见也是最少用的一个函数。

malloc 或 realloc 返回的是以 8 字节对齐的内存地址,在 64bits 上是 16 字节对齐。然而 memalign 或 valloc 可以更大的粒度进行字节对齐。

valloc 是一个废弃的函数,分配 size 大小的字节,返回已分配的内存地址指针,其内存地址将是页大小(page size)的倍数,如果分配失败返回 NULL。

The valloc() function allocates size bytes of memory and returns a pointer to the allocated memory. 

The allocated memory is aligned on a page boundary.

说了这么多,接下来我们看一下例子,如下代码示例:

// 对其分配内存,这个时候pchar值是随机的垃圾值
char *pchar = (char *)malloc(16);
// 手动初始化pchar的值,下面的方法则不需要
memset(pchar, 0, 16);

// calloc分配内存,会自动设置为0,不需要memset
char *pchar_orig = (char *)calloc(12, sizeof(char));

// 在原内存基础上,在堆内存空间中连续增加内存
// 如果原内存没有连续空间可拓展,realloc会新分配一个空间,将原有内存copy到新空间,然后释放原内存  
// 注意:realloc和malloc,只分配内存不进行赋值操作
char *pchar_dest = (char *)realloc(pchar_orig, 10);
  
// 相当于 malloc(60)
char *pchar_ini = (char *)realloc(NULL, 60);

free(pchar);
pchar = NULL;

free(pchar_orig);
pchar_orig = NULL;

free(pchar_dest);
pchar_dest = NULL;

free(pchar_ini);
pchar_ini = NULL;

glibc

上面说过这些内存管理函数都在头文件 stdlib.h 中,函数实现都在 malloc.c 文件中,这些都可以在C的标准库 glibc 中找到对应的代码,我下载的 glibc 是 2.29 这个版本。

glibc 和 libc 都是 Linux 下的 C 函数库。libc 库是Linux下的ANSI C的函数库也泛指一切符合C规范的库,glibc 是Linux下的GNU C函数库,也是一种 libc 的实现。glibc 本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准C库,而Linux下原来的标准C库Linux libc 逐渐不再被维护。Linux下面的标准C库不仅有这一个,如uclibc、klibc,以及上面被提到的Linux libc,但是 glibc 无疑是用得最多的,用 glibc 作为系统的C函式库,是GNU/Linux演进的一个重要里程碑,可以查看 维基百科 对 glibc 的介绍。

这里也说一下 ANSI C 函数库是基本的C语言函数库,包含了C语言最基本的库函数。这个库可以根据头文件划分为 15 个部分,其中包括:

  • <ctype.h>:包含用来测试某个特征字符的函数的函数原型,以及用来转换大小写字母的函数原型;
  • <errno.h>:定义用来报告错误条件的宏;
  • <float.h>:包含系统的浮点数大小限制;
  • <math.h>:包含数学库函数的函数原型;
  • <stddef.h>:包含执行某些计算 C 所用的常见的函数定义;
  • <stdio.h>:包含标准输入输出库函数的函数原型,以及他们所用的信息;
  • <stdlib.h>:包含数字转换到文本,以及文本转换到数字的函数原型,还有内存分配、随机数字以及其他实用函数的函数原型;
  • <string.h>:包含字符串处理函数的函数原型;
  • <time.h>:包含时间和日期操作的函数原型和类型;
  • <stdarg.h>:包含函数原型和宏,用于处理未知数值和类型的函数的参数列表;
  • <signal.h>:包含函数原型和宏,用于处理程序执行期间可能出现的各种条件;
  • <setjmp.h>:包含可以绕过一般函数调用并返回序列的函数的原型,即非局部跳转;
  • <locale.h>:包含函数原型和其他信息,使程序可以针对所运行的地区进行修改。地区的表示方法可以使计算机系统处理不同的数据表达约定,如全世界的日期、时间、美元数和大数字;
  • <assert.h>:包含宏和信息,用于进行诊断,帮助程序调试;
  • 其他;

在 glibc 库中可以找到 malloc.c 文件(路径是 glibc-2.29/malloc/malloc.c ),从中可以看到如下别名的定义:

strong_alias (__libc_calloc, __calloc) weak_alias (__libc_calloc, calloc)
strong_alias (__libc_free, __free) strong_alias (__libc_free, free)
strong_alias (__libc_malloc, __malloc) strong_alias (__libc_malloc, malloc)
strong_alias (__libc_memalign, __memalign)
weak_alias (__libc_memalign, memalign)
strong_alias (__libc_realloc, __realloc) strong_alias (__libc_realloc, realloc)
strong_alias (__libc_valloc, __valloc) weak_alias (__libc_valloc, valloc)
strong_alias (__libc_pvalloc, __pvalloc) weak_alias (__libc_pvalloc, pvalloc)
strong_alias (__libc_mallinfo, __mallinfo)
weak_alias (__libc_mallinfo, mallinfo)
strong_alias (__libc_mallopt, __mallopt) weak_alias (__libc_mallopt, mallopt)

__malloc 是 __libc_malloc 的别名,malloc 也是 __libc_malloc 的别名。其他以此类推。

所以看 malloc 函数的源码,直接看 __libc_realloc 函数实现即可,看 free 的源码可以看 __libc_free 的实现。

void *
__libc_realloc (void *oldmem, size_t bytes)

也可以在线查看 glibc 的源码,点击 这里 即可前往欣赏!

锄禾日当午,汗滴禾下土,五一节快乐~
在这里插入图片描述

Nerf 训练自有数据 colmap相机位姿转为LLFF格式数据 阅读详情

相关推荐

基准电压 + 运放 + 低边MOS恒流源控制原理

因为恒流源强制 Iout不变,而 Vin​ 增加时,负载压降 Iout⋅Rload不变,多余的电压只能由MOS管的 VDS承担,因此 VDS必然增加。在饱和区,MOS 管的 ID 仅由 VGS决定,与 VDS 无关,这样,负载变化时,VDS可自由调整以维持 Iout恒定。当 Vin​ 小到无法满足 VDS>VGS−Vth时,MOS管进入线性区,Iout 会随 Vin​ 下降而减小,恒流失效。由于 Vref和 Rsense未变,Iout无需调整,运放无需动作,OUT保持不变,Iout恒定。

weixin_50643237的博客 2658

linux内存分配函数功能与区别

用户空间内存分配主要使用标C库函数中的malloc,calloc,recalloc,valloc,alloc函数,下面来分析一下这些内存分配函数的功能与区别 (1)malloc 函数原型:void *malloc(size_t size) 函数功能:分配长度为size字节的内存块,并返回指向这部分内存首地址的指针。 (2)calloc 函数原型:void *callo

qq314942468的专栏 1221

别再凭感觉了!手把手教你用Excel搞定激光器MPE与NOHD安全计算(附模板下载)

本文详细介绍了如何利用Excel自动化计算激光器的MPE(最大允许照射量)和NOHD(标称眼危害距离),提升激光安全评估的效率和准确性。通过实战案例和模板下载,帮助工程师快速掌握GB/T 7247标准中的关键计算,避免常见错误,适用于激光测距仪等设备的安评工作。

weixin_30954265的博客 468

linux memalign、valloc、realloc

在GNU系统中,malloc或realloc返回的内存块地址都是8的倍数(如果是64位系统,则为16的倍数)。如果你需要更大的粒度,请使用memalign或valloc。这些函数在头文件“stdlib.h”中声明。     在GNU库中,可以使用函数free释放memalign和valloc返回的内存块。但无法在BSD系统中使用,而且BSD系统中并未提供释放这样的内存块的途径。    

lifengxun20121019的专栏 1298

MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏

MONAILabel in 3D Slicer 案例1: 在腹部CT中自动分割脾脏。

Tina姐的博客 1939

使用trae自动生成前后端分离的web应用程序

使用ai自动生成前后端分离的web应用程序

一介书生 2529

c 语言释放0地址是合法的.

我原来以为访问非法内存地址是非法的,包括0地址, 今天才发现,free(0)地址是允许的. 这算是一个特例吗? 测试代码如下: $ cat main.c #include <stdio.h> #include <stdlib.h> int main() { free(0); printf("pass test 0\n"); free((void *)1); printf("pass test 1\n"); return 0; } 运行结果如下: ./mem pa

hjjdebug的专栏 1132

Winform使用TreeView控件实现带复选框的三态树

刚接触c#,项目中用到Treeview实现三态,即选中、未选中、半选中状态,并且要求父子节点选择联动,效果类似下图网上有很多例子,于是研究了一下,结合网上大佬们的例子,所以在这里记录一下。首先新建一个Winform工程拖个TreeView控件,然后运行。。。嗯。。。加点数据吧。private void CreateTree() { TreeNode anime = new TreeNode...

laoyezha的博客 2万+

memalign的作用

转自:http://hi.baidu.com/narshben/item/ca95ca1bf43d90466926bbf5 ZZ: http://gs5689.blogbus.com/logs/36655475.html 在GNU系统中,malloc或realloc返回的内存块地址都是8的倍数(如果是64位系统,则为16的倍数)。如果你需要更大的粒度,请使用memalign或

1万+

5、数据库基础概念与数据建模全解析

本文深入解析了数据库的基础概念,包括函数依赖、决定因素和多值依赖等关键依赖关系,同时探讨了数据建模的重要方法论,如IDEF1X、信息工程和陈方法。此外,还介绍了SQL Server管理工作室的图表功能,帮助用户进行数据库的可视化设计。通过本文,读者将掌握数据库设计的核心知识,为构建高效、可扩展的数据库系统奠定基础。

81

一文让你轻松理解Wi-Fi理论速率计算方式

如上所示,在使用FDM的802.11协议上,最小子载波带宽为312.5KHz,那一个信道频宽为20MHz的信道可以分成64个子载波,但是由于技术原因,有效使用的是52个子载波,实际用于数据传输的只有48个,有4个子载波充当导频载波。载波:交流信号或者直流信号本身不具备数据传输能力,但是如果信号发生很小的波动或者变化,从而实现数据的收发。所谓子载波,就是将信号划为为很多的小信道,这些小信道可以实现数据的并发传输,子载波我们英文称为subcarrier,也称为音调(tone)。Symbol time如下所示。

1042484520@qq.com(邮箱) 3451

内存分配模块相关

内存分配备忘录

tinyic的博客 379

YOLOv11改进 | 主干/Backbone篇 | 轻量级移动端网络ShuffleNetV2(附代码+修改教程)

本文给大家带来的改进内容是ShuffleNetV2,这是一种为移动设备设计的高效CNN架构。其在ShuffleNetV1的基础上强调除了FLOPs之外,还应考虑速度、内存访问成本和平台特性。(我在YOLOv11n上修改该主干降低了GFLOPs,但是参数量还是有一定上涨,其非常适合轻量化的读者来使用,同时精度也有一定程度的上涨)。本文通过介绍其主要框架原理,然后教你如何添加该网络结构到网络模型中。

Snu77的博客 3388

C语言内存管理函数详解:mmap、munmap、malloc与free

C语言提供了多层次的内存管理工具,从标准库的malloc/free到系统级的mmap/munmap,开发者需要根据具体场景选择合适的方法。理解这些函数的工作原理和适用场景,能够帮助写出更高效、更安全的C程序。对于大多数应用,malloc/free是首选,它们简单易用且可移植;当需要处理大内存、文件映射或特殊内存需求时,mmap/munmap提供了更强大的控制能力。此外,calloc、realloc等函数补充了常见的内存操作需求。

niuTyler的博客 1624

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言实现malloc与free函数完成内存管理

在C语言中,malloc和free是用于动态内存管理的函数。(1)malloc函数malloc函数用于在堆(heap)中分配指定大小的内存空间,并返回一个指向该内存块的指针。size参数表示要分配的内存块的大小,以字节为单位。函数返回一个指向分配内存块的指针,如果分配失败,则返回NULL。使用场景:动态分配内存,例如在程序运行时根据需要创建数据结构。为字符串、数组、结构体等动态分配内存空间。(2)free函数free函数用于释放之前通过malloc或calloc函数动态分配的内存空间。

weixin_40933653的博客 652

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言实例_实现malloc与free函数完成内存管理

在C语言中,`malloc`和`free`是用于动态内存管理的函数。

876

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

C语言内存管理:malloc、calloc、realloc与free函数详解

C语言内存管理:malloc、calloc、realloc与free函数详解

一起coding,一起嗨。 2672

C语言菜鸟入门·内存管理calloc()函数、free()函数、malloc()函数

在 C 语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字符和数组等。C 语言提供了一些函数和运算符,使得程序员可以对内存进行操作,包括分配、释放、移动和复制等。void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。

时光の尘的博客 849

C语言学习之内存管理函数malloc()和free()

在C语言的学习中,对内存管理这部分知识的掌握尤其重要。 malloc()和free()的基本概念以及基本用法:

蛋蛋强的专栏 1810

C语言中内存管理(函数)(malloc、free、calloc、realloc)

实例: // c_memory_test.c #include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *p_str1, *p_str2; // 定义两个char*指针 /* 使用malloc()函数分配内存 */ p_...

qq_38769551的博客 374

C语言动态内存管理函数(malloc、calloc、realloc 和 free)

C语言动态内存管理函数的使用以及使用动态分配内存函数时需要注意的细节。

qq_55829345的博客 1763

C 语言内存管理语法全解析(malloc、calloc、free)

C 语言中的内存管理是一项非常重要的任务,需要程序员手动分配和释放内存。本文介绍了 C 语言中的内存管理语法,包括动态内存分配、内存释放和内存管理的最佳实践。通过正确使用这些语法和最佳实践,程序员可以确保程序的正确运行和避免内存泄漏等问题。

千千道的博客 2496

C语言内存管理7日速通:malloc、free实战与泄漏检测工具

在C语言的编程世界里,内存管理是一项核心且关键的技能。合理地管理内存不仅能提升程序的性能,还能避免诸如内存泄漏、悬空指针等严重问题。而`malloc`和`free`作为C语言中进行动态内存分配和释放的重要函数,是内存管理的基石。本文将带你在7天内快速掌握C语言内存管理,通过实战案例深入理解`malloc`和`free`的使用,并介绍实用的内存泄漏检测工具。

星辰夜语的博客 1097

C语言之free函数及野指针

【FROM MSDN && 百科】 原型:  void free(void *ptr); #include或#include Deallocate space in memory 释放ptr指向的存储空间。被释放的空间通常被送入可用存储区池,以后可在调用malloc、realloc以及realloc函数来再分配。 注意:连续两次使用free函数,肯定会发

hgj125073的专栏 1万+

malloc和free函数详解

本文介绍malloc和free函数的内容。   在C中,对内存的管理是相当重要。下面开始介绍这两个函数:   一、malloc()和free()的基本概念以及基本用法: 1、函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 关于分配失败的原因,应该

Dances with Wolves 的专栏 782

C语言中calloc、malloc、free用法

前言 C语言中提供了一些内存管理函数,这些内存管理函数可以在程序运行期间分配内存空间,即可以动态地分配内存,也可以将已经分配的内存空间进行释放。常用的内存管理函数有 calloc、malloc、free三个函数。 calloc函数的功能是向系统申请分配连续的内存空间,如果申请获得成功,则把所分配内存区域的首地址作为函数值返回,该函数的返回值是void类型的指针;如果申请没有获得成功,则函数返回空指针。calloc函数的原型是void *calloc(unsigned n, unsigned size); 因

夏之微风的博客 1665
上一篇: C 结构体指针初始化
下一篇: 你会计算C字符串长度吗?
veryitman
博客等级 码龄16年 472粉丝 310原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值