calloc、malloc、realloc函数的区别及用法

本文详细对比了C语言中malloc、calloc和realloc三个内存管理函数的用法和区别,包括它们的参数、返回值以及在实际编程中的应用示例。解释了calloc如何在分配内存的同时进行初始化,以及realloc如何用于内存的动态调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章已经生成可运行项目,

                          calloc、malloc、realloc函数的区别及用法!

三者都是分配内存,都是stdlib.h库里的函数,但是也存在一些差异。

(1)malloc函数。其原型void *malloc(unsigned int num_bytes);
num_byte为要申请的空间大小,需要我们手动的去计算,如int *p = (int *)malloc(20*sizeof(int)),如果编译器默认int为4字节存储的话,那么计算结果是80Byte,一次申请一个80Byte的连续空间,并将空间基地址强制转换为int类型,赋值给指针p,此时申请的内存值是不确定的。

(2)calloc函数,其原型void *calloc(size_t n, size_t size);
其比malloc函数多一个参数,并不需要人为的计算空间的大小,比如如果他要申请20个int类型空间,会int *p = (int *)calloc(20, sizeof(int)),这样就省去了人为空间计算的麻烦。但这并不是他们之间最重要的区别,malloc申请后空间的值是随机的,并没有进行初始化,而calloc却在申请后,对空间逐一进行初始化,并设置值为0;

实例:

    int *p = (int *)malloc(20*sizeof(int));
    int *pp = (int *)calloc(20, sizeof(int));
    int i;
    
    printf("malloc申请的空间值:\n\n");
    for ( i=0 ; i < 20; i++)
    {
        printf("%d ", *p++);
    }
    printf("\n\n");
    printf("calloc申请的空间的值:\n\n");
    for ( i=0 ; i < 20; i++)
    {
        printf("%d ", *pp++);
    }
    printf("\n");

结果:

很多人会疑问:既然calloc不需要计算空间并且可以直接初始化内存避免错误,那为什么不直接使用calloc函数,那要malloc要什么用呢?
实际上,任何事物都有两面性,有好的一面,必然存在不好的地方。这就是效率。calloc函数由于给每一个空间都要初始化值,那必然效率较malloc要低,并且现实世界,很多情况的空间申请是不需要初始值的,这也就是为什么许多初学者更多的接触malloc函数的原因。

(3)realloc函数和上面两个有本质的区别,其原型void realloc(void *ptr, size_t new_Size)
用于对动态内存进行扩容(及已申请的动态空间不够使用,需要进行空间扩容操作),ptr为指向原来空间基址的指针, new_size为接下来需要扩充容量的大小。
实例:

int main(void)
{
    const int size = 2000;
    int *p = (int *)malloc(20*sizeof(int));
    int *pp = (int *)realloc(p, size*sizeof(int));
    
    printf("原来的p_Address:%x   扩容后的pp_Address:%x \n\n", p, pp);
    
    return 0;
}


结果:

可从图看出,扩容后地址和原先地址是不一样的,但是这仅仅取决于扩容的内存大小。

实际上:

如果size较小,原来申请的动态内存后面还有空余内存,系统将直接在原内存空间后面扩容,并返回原动态空间基地址;如果size较大,原来申请的空间后面没有足够大的空间扩容,系统将重新申请一块(20+size)*sizeof(int)的内存,并把原来空间的内容拷贝过去,原来空间free;如果size非常大,系统内存申请失败,返回NULL,原来的内存不会释放。注意:如果扩容后的内存空间较原空间小,将会出现数据丢失,如果直接realloc(p, 0);相当于free(p).

本文章已经生成可运行项目
<think>好的,用户的问题是关于在Jetson Orin NX 16GB上使用Jetpack 6.2和TensorRT-LLM 0.12.0部署Qwen2.5-VL-7B-Instruct模型。首先,我需要确认用户提到的硬件和软件环境的兼容性。Jetson Orin NX是NVIDIA的边缘计算设备,Jetpack 6.2应该是其最新的操作系统版本,而TensorRT-LLM是针对大语言模型优化的推理库。 接下来,我需要考虑Qwen2.5-VL-7B-Instruct模型的特点。这是一个多模态模型,可能涉及视觉和语言任务,因此需要确认TensorRT-LLM是否支持这种模型的部署。另外,模型的参数规模是7B,这意味着在内存有限的Jetson设备上可能需要量化模型优化来减少内存占用。 用户提供的参考引用中提到了Jetson Xavier NX部署YOLOv8和Jetson Orin NX部署Ollama大模型的案例。这些案例中的步骤可能对当前问题有借鉴意义,比如使用Docker容器、安装依赖库、处理CUDA和cuDNN版本兼容性问题等。 然后,我需要整理部署流程的大致步骤。通常,这类部署包括环境准备、模型转换、优化、部署和测试几个阶段。环境准备方面,需要安装Jetpack 6.2,确认TensorRT-LLM 0.12.0的安装方法,可能通过源码编译或预编译包。模型转换可能需要将原始模型转换为TensorRT支持的格式,比如使用ONNX作为中间表示,再通过TensorRT的转换工具生成优化后的引擎。 考虑到Jetson设备的计算资源限制,可能需要应用量化技术,如FP16或INT8量化,以减少模型的内存占用和提升推理速度。此外,多模态模型可能涉及图像处理和文本处理的结合,需要确保相关库如OpenCV、PyTorch等正确安装,并与TensorRT-LLM兼容。 另外,用户可能遇到黑屏问题,如参考引用中提到的,可能需要检查硬件连接或系统配置。不过当前问题主要聚焦在部署流程,这部分可能不需要深入,但可以作为潜在问题在注意事项中提到。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能优化方法、处理多模态输入的技巧、内存管理策略等,以及与其他模型的对比或迁移学习的可能性。需要确保问题覆盖部署的不同方面,帮助用户全面了解可能遇到的挑战和解决方案。</think>### 在Jetson Orin NX上部署Qwen2.5-VL-7B-Instruct模型的步骤 **环境要求** - 硬件:Jetson Orin NX 16GB - 系统:Jetpack 6.2(需包含CUDA、cuDNN、TensorRT等组件) - 框架:TensorRT-LLM 0.12.0 - 其他依赖:Python 3.8+、PyTorch 2.0+(需适配Jetpack版本) --- ### 部署流程 1. **系统环境配置** - 安装Jetpack 6.2,确保CUDA 12.2、cuDNN 8.9、TensorRT 8.6.1等组件已预装[^1]。 - 更新系统并安装基础工具: ```bash sudo apt update && sudo apt upgrade -y sudo apt install python3-pip cmake libopenblas-dev ``` 2. **安装TensorRT-LLM 0.12.0** - 从源码编译TensorRT-LLM(需适配Jetson架构): ```bash git clone https://github.com/NVIDIA/TensorRT-LLM.git cd TensorRT-LLM && git checkout v0.12.0 mkdir build && cd build cmake .. -DCMAKE_CUDA_ARCHITECTURES=87 # Jetson Orin的Compute Capability为8.7 make -j$(nproc) ``` - 安装Python依赖: ```bash pip3 install tensorrt_llm==0.12.0 --extra-index-url https://pypi.nvidia.com ``` 3. **模型转换与优化** -Qwen2.5-VL-7B-Instruct转换为TensorRT引擎格式: ```bash python3 convert_checkpoint.py --model_dir ./qwen2.5-vl-7b-instruct \ --output_dir ./trt_engines \ --dtype float16 # 使用FP16减少内存占用 ``` - 若需进一步优化推理速度,可尝试INT8量化(需校准数据集)。 4. **部署与测试** - 编写推理脚本,加载TensorRT引擎并处理输入: ```python from tensorrt_llm.runtime import ModelRunner runner = ModelRunner.from_dir("./trt_engines") output = runner.generate(prompts=["输入多模态数据示例"], max_output_len=100) ``` - 针对多模态输入(如图像+文本),需预处理数据对齐模型输入格式。 --- ### 注意事项 1. **内存限制**:7B模型在FP16下约需14GB显存,需通过`swap空间扩展`或`激活卸载`优化内存[^2]。 2. **多模态支持**:确保视觉模块(如CLIP)的预处理代码与TensorRT兼容。 3. **性能调优**:使用`nsight-systems`分析瓶颈,调整`batch_size`和`max_seq_len`参数。 ---
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

魏波.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值