c语言中memcpy与memmove的区别

【C语言】浅谈memcpy与memmove 的区别 memcpy与memmove 的区别(文章中默认计算机为小端存储模式) 1.两个函数都包含于<string.h>头文件中 2. 首先看memcpy函数的定义 void *memcpy( void *dest, const void *src, size_t count ); dest表示目的地地址,用指针变量加以维护;同理,src表示源地址;count是一个无符号整型,表示将从源地址往后拷贝多少个字节大小的数据 3.再看memmove函数的定义 void *memmove( void *des 阅读详情

        众所周知在处理字符数组的时候我们会用到strcpy函数,但是这个函数的局限性也很大很明显那就是只能用于字符类型的数组的处理,为了更加通用方便的使用一样效果的函数,我们就引入了memcpy和memmove两个函数,这两个的函数功能相同但用处有差别,接下来就细细分析这两个函数的异同

        同

        

 通过查阅资料发现这两个函数的参数类型是一样的,返回类型也是一样的,而且实现的功能也是一样的----把src指针向后count字节的数覆盖在dest指针后面count字节里面

        异

既然这两个函数这么相似那有什么不同呢?

我们可以通过运行这个代码来发现

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



int main()
{
	int arr1[20] = { 1,2,3,4,5 };
	int i = 0;
	printf("memcpy实现\n");
	memcpy(arr1 + 1, arr1, 12);
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr1[i]);
	}
	printf("\n");


	int arr2[20] = { 1,2,3,4,5 };
	printf("memcpy实现\n");
	memcpy(arr2, arr2 + 1, 12);
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr2[i]);
	}
	printf("\n");


	int arr3[20] = { 1,2,3,4,5 };
	printf("memmove实现\n");
	memmove(arr3 + 1, arr3, 12);
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr3[i]);
	}
	printf("\n");

	int arr4[20] = { 1,2,3,4,5 };
	printf("memmove实现\n");
	memmove(arr4, arr4 + 1, 12);
	for (i = 0; i < 5; i++)
	{
		printf("%d ", arr4[i]);
	}
	printf("\n");


	return 0;
}

 

 这边我们可能发现是一样的并没有什么不同,但是这是因为我的编译器(VS2022)已经修复了这个问题,在别的编译器上可能就会产生不同的结果,毕竟我们不能赌编译器有没有修复,而是真正了解他们的不同.

既然没有实例那就直接讲不同的方面,memcpy是从前往后一个一个拷贝的,这样会出现什么问题呢?我们可以参考这个代码

我们想要实现的是1 1 2 3 5,但是如果我们严格按照从前往后一个一个拷贝我们会发现第一次arr1[1]中的2会被覆盖成1,那下一次你要把arr1[2]的值赋给arr1[3]时我们期望的是arr1[3] = 2,

但是你的arr1[2]已经为1所以你的arr1[3]就会被赋值为1,就会发现与期望的值不同,这就是memcpy的弊端,但是memmove就修复了这个bug,它考虑了这个情况所以会很好的避免这种情况的发生,因此在出现重叠拷贝的时候我们优先考虑memmove而不是memcpy来以防万一

 

 

C语言中:memmove、memcpy和strcpy的区别 memcpy()和memmove()都是c语言的库函数(头文件保护#include ),作用是拷贝一定长度内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是未定义的(取决于编译平台内部对memcpy的优化处理)。memmove()和memcpy()函数对所有类型都使用,为内存拷贝(原理:就是利用字节数,交换位置数据的);②.memmove()函数在memcpy()函数的基础上加入了对内存重叠拷贝的处理;count:拷贝的字节数。 阅读详情

相关推荐

NoC架构深度解析:从拓扑结构到流量控制的全面指南

本文深入解析了片上网络(NoC)架构,从总线架构的瓶颈出发,阐述了NoC作为芯片内部“交通网”的核心优势。文章详细探讨了主流拓扑结构(如Mesh、Torus、Ring)的选型权衡,并系统介绍了数据包格式、路由算法、路由器流水线、流量控制机制以及网络接口(NI)设计,为理解现代多核SoC的通信基石提供了全面指南。

gg901的博客 1042

memcpy与memmove函数的区别和实现

memcpy与memmove都是C语言的库函数,在头文件string.h中,作用是内存拷贝。唯一的区别是,当内存发生局部重叠时,memmove保证了拷贝的结果是正确的,但是memcopy不一定是正确的。但是memcpy比memmove速度快。destination即目标空间,即要复制到哪个空间source即源空间,即要被复制的内存空间num即要复制多少个字节的内容到destinationvoid*即返回目标空间。

蜗牛的专栏 1920

uses ARM-Compiler ‘Default Compiler Version 5‘ which is not available. MDK5.37安装ARM_Compiler_5

MDK5.37安装ARM_Compiler_5 最后一个AC5编译器,从MDK5.37开始,不再默认安装,需要独立安装 ARMCompiler_506_Windows_x86_b960.zip (80.94MB) 否则使用AC5编译代码报错如下: Build started: Project: Project *** Target 'STM3210C_EVAL' uses ARM-Compiler 'Default Compiler Version 5' which is not available. *

mowwwcom的专栏 2万+

memcpy 和 memmove区别

综上所述,选择使用memcpy还是memmove取决于:是否可能遇到。的情况或需要确保数据正确复制的情况下,应使用。因其效率较高而常用;

zxf347085420的博客 639

使用Java实现CRC16 MODBUS 格式校验

CRC16校验,测试如下 String str = "a5 98 03 00 00 5f c6 0f 7c 40 78 06 09 46 dc 6e db 00 16 3e 12 5c 98 00 19 98 0e 10 03 06 09 46 dc 6e db 03 0b bf 5f c6 0f 7c 43 bd b9 61 ee 96 76 99"; 校验规则: /** * CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结

weixin_45063710的博客 1315

R_柱状图(加误差线,显著性差异)

先放最终效果图 结果图 # bar_plot 2021/01/19 # 导入所需的包 library(ggplot2) library(ggthemr) library(ggsignif) library(tidyverse) library(dplyr) library(ggpubr) library(devEMF) # 导入并处理数据,需要两张表,一个是原始汇总表格,另外一些是每一...

wt141643的博客 2万+

memcpy与memmove的速度差别

VC6.0: 1、memcpy 从一块缓存到另一块缓存复制30M数据耗时 (12.6 + 11.5 + 11.8 + 11.7 + 11.3 ) / 5 = 11.78ms 2、memmove 从一块缓存到另一块缓存复制30M数据耗时 (10.1 + 10.2 + 10.3 + 12.6 + 11.1)/ 5 = 10.86ms 不同的缓存地址,memmove 与memcpy 速度相当,me...

架构设计 4670

【AutoCAD中实现双击文本编辑功能】

例如:以下是官方博客例子浅析先加入相关的头文件和库文件。在AutoCAD中有一个很重要的功能,就是双击图形尺寸或文本后会出现一个文本编辑框,用户可在该编辑框中修改文字。本文介绍了如何使用AcEdInplaceTextEditor来实现该功能。实现cad的消息监听。创建一个消息监听的类并在cad中注册来实现消息监听。主要是监听键盘输入。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了的函数和方法。

我的博客 1149

C语言内存拷贝函数memmove与memcpy详解与对比

本文介绍了C语言中memcpy和memmove两个内存拷贝函数的区别。memcpy速度快但不处理内存重叠,适用于确定无重叠的场景;memmove能安全处理内存重叠,通过自动判断拷贝方向避免数据覆盖,虽然性能稍慢但通用性更强。关键区别在于:memcpy对重叠内存的行为未定义,而memmove会检测重叠并调整拷贝顺序(目标地址在前则从前往后,在后则从后往前)。建议优先使用memmove确保安全,仅在确定无重叠且需要极致性能时选用memcpy。现代编译器优化后两者性能差距已很小。

张佳航的博客 1387

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

目录一、前言:YOLO26原生损失函数在小目标检测中的核心痛点(涨点瓶颈)1.1 小目标权重不足,聚焦能力薄弱1.2 样本分布不平衡适配性差,正负样本权重失衡1.3 训练不稳定,易出现梯度消失/震荡1.4 未区分小目标与背景的冗余干扰,误检率高二、TGRS 2025顶刊灵感解析:自适应聚焦损失的核心逻辑三、全网独家创新:AdaFocalLoss损失函数设计与YOLO26适配(核心重点,可复现)3.1 AdaFocalLoss函数整体设计(独家设计,清晰可复现)3.2 各核心模块详细设计(独家创新,可直接复现

qq_36130719的博客 203

PCL 点云加权均值收缩

PCL 点云加权均值收缩

dayuhaitang1的博客 689

# 深入解析 C 语言中的 memcpy 与 memmove:内存操作的双雄

memcpy` 和 `memmove` 是 C 语言中用于内存操作的两个重要函数。`memcpy` 假设源内存和目标内存之间没有重叠,因此在没有重叠的情况下效率更高;而 `memmove` 能够正确处理内存重叠的情况,虽然可能会稍微慢一些,但提供了更高的安全性。在实际编程中,如果不确定内存是否重叠,建议优先使用 `memmove`,以确保程序的健壮性。

lhxcc_fly的博客 1095

当启动容器的时候提示:exec format error?如何解决问题

Docker容器出现"exec format error"的主要原因是架构不兼容(如ARM设备运行x86镜像)。解决方案包括:1)匹配镜像与宿主机架构;2)构建时指定平台;3)安装QEMU模拟器;4)修复文件权限和格式;5)验证基础镜像兼容性。排查流程应从检查架构匹配开始,逐步验证权限、解释器和换行符等问题。建议优先使用多架构镜像,构建时明确指定平台,并使用buildx工具生成多平台镜像。调试时可进入容器手动验证文件格式和兼容性。

weixin_39291964的博客 2719

C语言memmove和memcpy的区别以及模拟实现库函数memmove

模拟实现库函数memmove void *my_memmove(void *destination, const void *source, int num) { assert(destination&&source); char *dest = (char *)destination; char *src = (char* )source; if (dest>src&&dest<(src +num)) { dest = dest + num - 1

shuangweiyebai的博客 269

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言中,memmove和memcpy的区别?

在C语言中,memmove和memcpy均用于内存块的复制,但关键区别在于对内存重叠的处理。

汽车电子软件领域知识分享 690

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C语言库函数 memcpy 和 memmove 的区别

基本概念阐述memcpy和memmove都是 C 语言的库函数,相比于strcpy和strncpy只能针对于字符类型的数组(),这两个函数可以拷贝其他类型的数组,对于memcpy和...

263

深度学习工具包 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语言函数memcpy与memmove的区别】

C语言库函数memcpy与memmove对比

kuang921011的博客 375

c语言memcpy与memmove区别

文章目录c语言memcpy和memmovememcpymemcpy的实现例子1例子2例子3 ——覆盖原有部分数据:memmove例子1memmove的实现区别memmove的实现方案参考资料 c语言memcpy和memmove memcpy void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 复制 n 个字节到存储区 str1 str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。 str2 – 指向要复

mirana的专栏 616

C语言函数strcpy、strncpy、memcpy、memmove函数的区别以及一些坑

一、函数说明 1、strcpy函数 char* strcpy(char* dest, const char *src); 说明: 函数strcpy把src指向的串(包括空字符)复制到dest指向的数组中。如果复制发生在两个重叠的对象中,则这种行为未定义,其中如果中间字符遇到'\0'停止复制。 返回值: 函数strcpy返回dest的值。 举例: #include<stdio...

wh_computers的博客 967

[c语言]——memcpy和memmove区别

memcpy 函数声明: void* memcpy(void* dest, const void* src, size_t count); 头文件: #include&lt;string.h&gt;或者#include&lt;memory.h&gt; 参数: dest: New buffer src: Buffer to copy from count: Number of char...

lucky52529的博客 547

【C语言】memcpy函数和memmove函数的实现与区别

C语言

SuLiJuan66的专栏 871

C语言memcpy和memmove函数的理解和区别

简介:NRF24L01是NORDIC公司生产的一款无线通信芯片,采用FSK 调制,集成NORDIC自家的Enhanced Short Burst协议。可以实现点对点或是1对6的无线通信。无线通信速度最高可达到2Mbps。 NRF24L01采用SPI通信,可以很方便的连接到MCU上面。特点: 2.4G全球开放的ISM频段,免许可证使用。 最高工作速率2Mbps,高效的GFSK调制,抗干扰能力强。 1

zorrorun's blog 3548

C语言内存函数实战:memcpy/memmove/memset/memcmp用法与区别

C语言内存函数是针对内存块(一块内存)来处理的mem-memory-记忆-内存memcpy-内存拷贝memmove-内存移动memset-内存设置memcmp-内存比较。

2501_91369424的博客 977

【C语言内存函数完全指南】:memcpy、memmove、memset、memcmp 的用法、区别与模拟实现(含代码示例)

本文深入解析C语言四大内存函数:memcpy、memmove、memset和memcmp。通过图解和代码示例,详细讲解各函数的功能特性和使用场景:memcpy实现高效内存拷贝但不处理重叠区域;memmove智能处理内存重叠;memset用于内存初始化;memcmp比较内存内容。文章还提供了模拟实现代码,帮助开发者深入理解底层原理。特别强调memcpy与memmove的关键区别,并给出内存重叠问题的解决方案,是提升C语言内存管理能力的实用指南。

小韩的博客 2849

memmove和memcpy区别

memmov和memcpy区别 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memcpy()和memmove()都是c语言的库函数,在头文件string.h 中,作用是拷贝一定长度内存的内容。它们唯一的区别是当内存发生局部重叠时,memmove可以保证拷贝正确,memcpy拷贝的结果是未定义的(取决于编译平台内部对memcpy的优化处理)。函数声明如下: void * memmov...

bajianxiaofendui的博客 2万+
下一篇: C++实现通讯录程序
TJSW_
博客等级 码龄4年 16粉丝 7原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值