未解决:不同类型的数据用memcpy然后打印(printf)出问题

news2024/11/15 17:57:36

引子:

本来是搜memcpy在拷贝两个数组时两数组下标类型不同的问题,即,若一个数组是很长,其下标用long型,要将此数组的一小段拷贝到另一个数组中,这另一个数组的下标只需要用int型,不确定会不会出问题。

int i;

long j;

unsigned n = 2;

memcpy( &des_buf[i], &ori_buf[j], n*sizeof(des_buf[0]) );

测试代码:

short i = 2;

int j = 65537;

int n = 2;
float des_buf[10] = { 0 };
float ori_buf[100000] = {0};
ori_buf[j] = 0.1;
ori_buf[j+1] = 0.2;
memcpy(&des_buf[i], &ori_buf[j], n * sizeof(des_buf[0]));

des_buf的内存:

是没有问题的,哪怕n的类型是int而不是unsigned int。

问题:

然后搜到:

memcpy,复制内存,但是字节数和参数给定的不一样_百度知道 (baidu.com)

是这个帖子的问题。

看了二楼的答案,试了不行,还是打印一样的结果。

暂时我也还没找到问题在哪,只不过做了一些试验,得到一些结论,先记在这里了。

先将代码改成这样标准点,将value用二进制打印出来,看下其占几个字节,每个字节的值:


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

void main()
{
	char* des = NULL;
	des = (char*)malloc(2);
	int value = 0x8547;

	char buf[128];
	_itoa(value, buf, 2);
	printf("二进制: %s\n", buf);

	memcpy(des, &value, 2*sizeof(char));

	char* test = NULL;
	for (test = des; test < des + 2; test++)
	{
		printf("0x%02X,", *test); // 打印十六进制的ASCII码 两位表示
	}

	free(des);
}

结果:

分析、测试过程:

二进制值,0x8547,确实是按照字节来转的,即85对应10000101,47对应01000111。

按说,vaule是32位的,即有四个字节,但是这里转化后只有两个字节,认为是最低的两个字节,拷贝时,也是拷贝低两个字节,且,默认数据是按照小端对齐存储,即两个字节在内存中是按照47 85来存的,所以拷贝时,先拷贝47这个字节,再拷贝85这个字节。

对应打印时,先打印47这个字节,再打印85这个字节,顺序是对上的,只是85这个字节打印得不对。

其次,我们来看内存,即拷贝情况:

1、

des申请内存后的值:

前两个字节,是有初值的。

执行memcpy语句后,des值:

可见,两个字节是拷贝成功了,顺序也是对的。

des地址再往前看一点:

前面都是fd 00之类。没有ff之类。

2、

将test指针指向des,看test:

和des一样。往前看一点:

也是一样的,都是fd 00之类。没有ff之类。

3、

打印第一次,即打印第一个字节:

打印第二个字节:

先看内存,此时地址变为:

即地址确实是加了一个字节,按说应该打印85。打印:

打印不对了!

4、做其他尝试

怀疑这个打印值有问题,因为正常0x85值是133,133用有符号的一个字节是表示不了的,即超出表示范围,或者说,int的四个字节,不应该用倒数第二个字节表示0x85,而是要向左再多一位?但是这里貌似每个十六进制字节就是对应二进制8位表示,比如如果value = 0x668547,相应拷贝3个char数据并打印:

可见,value的倒数第三个字节,只会保存字节数据0x66。且,这里打印也是对的。那么,是数值0x85不能正确打印了。将value值改为3587,再走一遍上面1 2 3流程:

des:

test:

打印:

明明是要打印一个字节的87,却打印出4个字节的0Xffffff87.

看des前的字节:

也不是ff这种啊。那么是打印时出错?

第一次打印test前test前的字节:

前面字节也没有ff这种。

test++:

打印:

35这一个字节正常打印。

所以还是打印问题,拷贝应该是没有问题的。

5、但是——直接打印0x87:

加一句打印:

printf("0x%02X,", 0x87);

这里,好像0x87是可以打印的!因为就是一个字节啊......

那么,是偏移地址不对???

看此时的监视窗口:

71即是0x47的十进制值,对应的ASCII码是G。所以打印47是没问题的。然而,此时test指针指向的字节的值,实际是-123,即133-256,因为0x85=133超过128,所以是负值?实际是-123?那么printf按照0x格式打印-123时,就导致打印错误?

直接:printf("0x%02X,", -123);

结果,确实是打印出:

将原程序打印改为十进制:printf("%d,", *test); 

结果:

其实就是打印3个字节,且顺序也是对的。所以——

6、最终结论:

是格式转换的问题!要将一个字节数据转换为0x即十六进制时,如果这个字节数据是有符号的,那么可能会出现负值,此时转十六进制会出问题,会打印出前面加3个FF字节,至于为什么是这样加,目前确实还没想明白。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2053731.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++高性能编程:ZeroMQ vs Fast-DDS发布-订阅模式下性能对比与分析

文章目录 0. 引言1. 目标&#xff1a;ZeroMQ与Fast-DDS性能对比2. ZeroMQ vs Fast-DDS - 延迟基准测试2.1 一对一发布-订阅延迟2.2 一对多发布-订阅延迟 3. ZeroMQ vs Fast-DDS - 吞吐量基准测试4. 方法论5. 结论6. 参考 0. 引言 高要求的分布式系统催生了对轻量级且高性能中间…

MATLAB口罩检测系统

一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分&#xff0c;利用摄像机对图像进行采集&#xff0c;从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情&#xff0c;人们生活秩序被严重打乱。跟普通流感…

前端Vue监听路由变化, 点击页面内按钮跳转菜单更改导航菜单选中状态

1.问题描述 当我们进入页面时的菜单导航栏是默认选中的状态如图 点击博客园效果如图 问题1&#xff1a; 但是当我们点击页面上方返回按钮时&#xff0c;导航栏选中状态没有改变 分析问题1&#xff1a; 这个问题是因为页面改变后页面里面存储的菜单导航栏的is-active属性没有改…

WIFI 密码

要破解 WIFI 密码&#xff0c;首先要抓到 WIFI 的握手包&#xff0c;要想得到 WIFI 的握手包&#xff0c;就需要在监听时刚好有设备连接了该 WIFI&#xff0c;但这就需要运气加成&#xff0c;因此可以我们可以主动将该 WIFI 的设备踢下去&#xff0c;一般设备就会自动连接该 WI…

机器学习:逻辑回归算法实现鸢尾花预测和银行数据处理

1、鸢尾花预测 1、特征选择 2、对特征处理 trainpd.read_excel("鸢尾花训练数据.xlsx") testpd.read_excel("鸢尾花测试数据.xlsx") x_traintrain[["萼片长(cm)","萼片宽(cm)","花瓣长(cm)","花瓣宽(cm)"]] y_tr…

HTML及CSS面试题4

1、BFC 1.1、介绍BFC及其应用 补充——触发BFC的方式&#xff0c;常见的有&#xff1a; 设置浮动overflow设置为&#xff1a;auto、scroll、hiddenpositon设置为&#xff1a;absolute、fixed 介绍&#xff1a; ○ 所谓BFC&#xff0c;指的是&#xff1a;一个独立的布局环境&am…

C2M商业模式分析与运营平台建设解决方案(一)

C2M&#xff08;Customer to Manufacturer&#xff09;商业模式通过直接将消费者需求与生产商对接&#xff0c;极大提升了生产效率和市场响应速度&#xff0c;本文将探讨如何通过构建高效的运营平台&#xff0c;利用大数据分析、人工智能算法及灵活的供应链管理&#xff0c;优化…

四川汇昌联信做拼多多电商怎么样?

近年来&#xff0c;拼多多凭借其独特的社交电商模式迅速崛起&#xff0c;成为国内领先的电商平台之一。四川汇昌联信作为一家专注于电商领域的企业&#xff0c;涉足拼多多平台无疑是顺应市场趋势的明智之举。那么&#xff0c;四川汇昌联信在拼多多平台上的表现如何呢? 一、产品…

推荐国产跨平台、轻量级的文本编辑器 Notepad-- v2.18

Notepad-- 是使用C编写的轻量级文本编辑器, 简称ndd, 可以支持Window/Mac/Linux操作系统平台。 我们的目标&#xff1a;完成文本编辑类软件的国产可替代&#xff0c;重点在国产Uos/Linux系统、Mac 系统上发展。 对比其它竞品Notepad类软件而言&#xff0c;我们的优势是可以跨…

【unix高级编程系列】信号

引言 以前对信号的理解&#xff0c;仅仅停留在main函数入口注册几个异常信号&#xff08;SIGPIPE、SIGSEGV、SIGFPE&#xff09;处理函数。当捕获到异常时&#xff0c;将进程的堆栈进行打印&#xff0c;方便排查、定位问题。这一类问题我认为是利用linux系统的异常信号机制&am…

系统架构师选择题知识点笔记

系统架构师复习笔记 选择题知识点 分布数据库特性 分片透明性&#xff1a;指用户或应用程序不需要知道逻辑上访问的表具体是怎么分块存储的&#xff1b;复制透明性&#xff1a;指采用复制技术的分布方法&#xff0c;用户不需要知道数据是复制到哪些节点上&#xff1b;逻辑透…

AI绘画网站爆款推荐,人人都是艺术家!

嗨&#xff0c;小伙伴们&#xff0c;最近AI 绘画简直是火出了新高度&#xff01;网上那么多 AI 绘图站&#xff0c;你或许已经眼花缭乱。但悄悄告诉你&#xff0c;有些站点只能照搬照片&#xff0c;却不让你天马行空地改造&#xff0c;想找一个既聪明又有创意的 AI 画家&#x…

Nginx详解配置实例及企业高性能web服务器

目录 企业高性能web服务器 一.Web 服务基础介绍 1.1 互联网发展历程回顾 1.2 Web 服务介绍 1.2.1 Apache 经典的 Web 服务端 1.2.1.1 Apache prefork 模型 1.2.1.2 Apache worker 模型 1.2.1.3 Apache event模型 1.2.2 Nginx-高性能的 Web 服务端 1.2.3服务端 I/O 流…

循环图神经网络教程2——循环图神经网络

介绍 循环图神经网络&#xff08;Recurrent Graph Neural Network&#xff0c;RGNN&#xff09;。在标准神经网络中&#xff0c;连续的学习权重层用于从输入张量中逐步提取更高级别的特征。在用于计算机视觉的神经网络中&#xff0c;低级特征(如短直线和曲线)的存在是由较早的…

Java类的卸载

类、类的加载器、类的实例之间的引用关系 类的生命周期 类的加载器如下&#xff1a;

进程部分相关概念

进程 进程是一个程序执行的过程&#xff0c;会去分配内存资源&#xff0c;cpu的调度 进程不仅仅是一个正在运行的程序&#xff0c;它包含了程序执行所需的所有资源和状态信息 资源分配&#xff1a;操作系统会为每个进程分配必要的资源&#xff0c;如内存空间、文件句柄等。这些…

nginx重定向与防盗链

重定向 由于网站的扩容&#xff0c;负荷较大&#xff0c;需要将一部分内容迁移到其他服务器上。但是这个时候又不能更改用户常访问的域名&#xff0c;因此对其进行重定向。 1. 域名重定向 www.sxl1.com/aaa的站点需要重定向到aaa.sxl1.com rewrite ^/aaa$ aaa.sxl1.com/…

letcode 分类练习 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

letcode 分类练习 513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树 513.找树左下角的值112. 路径总和106.从中序与后序遍历序列构造二叉树 513.找树左下角的值 遍历二叉树&#xff0c;并记录当前的深度&#xff0c;如果深度大于最大深度&#xff0c;那么…

关于 Vivado HLS 的三大误读

【转载】关于 Vivado HLS 的三大误读 目前&#xff0c;在高层次综合&#xff08;HLS, High Level Synthesis&#xff09;领域&#xff0c;Vivado HLS可谓独树一帜。它有效地拉近了软件工程师与FPGA之间的距离&#xff0c;加速了算法开发的进程&#xff0c;缩短了产品上市时间。…

leetcode_52. N 皇后 II

52. N 皇后 II 题目描述&#xff1a;n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2…