首页 > 系统相关 >char*到int[] 内存拷贝存疑

char*到int[] 内存拷贝存疑

时间:2023-08-06 12:12:26浏览次数:31  
标签:x00 test5 int char intArray 存疑 data

C++ 中Array和Vector内存地址都是连续的,那么也可以把一块连续的字符串或二进制数据char*、char[],转成int[]、double[]数据吧。

    void test5(){
        // 假设有一个 char* 指向字符串的内存数据
        char* data = "hello";
        size_t dataSize = strlen(data) * 4;
        size_t intArraySize = dataSize / sizeof(int);
        int* intPtr = reinterpret_cast<int*>(data);
        int intArray[intArraySize];
        memcpy(intArray, intPtr, dataSize);
        for (size_t i = 0; i < intArraySize; ++i) {
            std::cout << "test5 intArray[" << i << "] = " << intArray[i] << std::endl;
        }
    }

 

上方定义了 char* data = "1" 想将,其数据拷贝到  intArray 中。尝试用std::string,但结果是不稳定的!只有char*稳定。

 

PS:

1.strlen()无法读取char*字符的情况。
char* data0 = "\x01\x00\x00\x00\x02\x00\x00\x00";
无法用strlen(data0)读取取其长度,这里本应该为8字节,但是x00 就是 '\0'的16进制编码,这里相当于第一个字节'x01后就结束了',读取长度为1.

 

2.字符串std::string的内存对象数据往int[]中拷贝有很多未知因素,导致拷贝随机化。原因暂未知。

test5_0()和test5_1()完全一致的转换但打印结果不同。甚至去掉下面注释行下面的打印,都会导致结果更不稳定。目前使用char*拷贝是稳定的。

   void test5_0(){
        string data = "hello";
        size_t dataSize = data.size() * 4;
        size_t intSize = dataSize / 4;
        int intArr[intSize];
        memcpy(intArr, data.c_str(), dataSize);

        for (int xx : intArr ){
            std::cout << "test5_0[i] = " << xx <<std::endl;
        }
    }

    void test5_1(){
        string data = "hello";
        size_t dataSize = data.size() * 4;
        size_t intArraySize = dataSize / 4;
        int intArray[intArraySize];
        memcpy(intArray, data.c_str(), dataSize);

        for (size_t i = 0; i < intArraySize; ++i) {
            std::cout << "test5_1 intArray[" << i << "] = " << intArray[i] << std::endl;
        }

        // 若注释掉此打印行,则上面 test5_1 intArray 行的打印会出现问题
        for (int xx : intArray ){
            std::cout << "test5_1[i] = " << xx <<std::endl;
        }
    }

 

打印结果:

test5_0[i] = 1819043176
test5_0[i] = 111
test5_0[i] = 0
test5_0[i] = 0
test5_0[i] = 0
test5_1 intArray[0] = 1819043176
test5_1 intArray[1] = 111
test5_1 intArray[2] = 5
test5_1 intArray[3] = 0
test5_1 intArray[4] = 1819043176
test5_1[i] = 1819043176
test5_1[i] = 111
test5_1[i] = 5
test5_1[i] = 0
test5_1[i] = 1819043176

 

 

 

 

 

 


 

标签:x00,test5,int,char,intArray,存疑,data
From: https://www.cnblogs.com/scarlet/p/17609258.html

相关文章

  • Scientific Internet Surfing
    1.Background作为一名烟酒生不管是学习还是那啥都需要一些国外的资源,在windows和安卓平台上都可以找到很多好用的加速器,比如liebao加速器(我本人只用过这个),还有一些博客会推荐Nord或者Express(但是访问不了)博客地址虽然要付费吧,但是物有所值,总归是能解决问题,可是这事放到li......
  • Pinpoint 03
    原文地址:https://www.cnblogs.com/bornToBeWeird点击原文地址阅读,支持作者~概念超级马里奥效应Seefailureasabeginning.——理查德·费曼(RichardFeynman)如何让学习像打游戏一样上瘾?!得上嗜学如命症,不学就难受!游戏从来都是低风险、高回报的。玩家可以无限制地挑战......
  • Painting the Fence 题解
    题目传送门一道枚举题。我们可以直接枚举那\(2\)个去掉的粉刷匠。先统计一下每个栅栏会被多少个粉刷匠刷到,然后枚举第一个被去掉的粉刷匠,然后计算剩下的粉刷匠会将每个栅栏刷到多少次,我们只需要看只能被刷\(1\)次的栅栏就行了。接着处理一个前缀和数组,记录前\(i\)个栅栏......
  • 【JointJS】ref 属性和 calc 相对计算函数
    在define函数和calc相对计算函数中提到了calc相对计算函数,默认情况下,不指定ref属性,calc以这个g标签作为基点计算值。而一个图形下面(也就是一个g标签),会有很多其他子图形,例如,<ellipse>、<text>、<rect>等。如上图所示,这是一个由define函数自定义的图形,其包含了......
  • java-concurrent-interview-must
    10道不得不会的Java并发基础面试题以下都是Java的并发基础面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。评论区见1.start()方法和run()方法的区别如果只是调用run(......
  • 前端项目实战拾肆-window上‘PORT‘ is not recognized as an internal or external c
    mac"scripts":{"dev":"PORT=3005nextdev","build":"nextbuild","start":"nextstart","lint":"nextlint","test":"jest"......
  • Android学习笔记(三五):再谈Intent(下)-一些实践
    Android的UI框架要求用户将他们的app分为activity,通过itent来进行调度,其中有一个mainactivity由Android的launcher在桌面中调用。例如一个日历的应用,需要查看日历的activity,查看单个事件的activity,编辑事件的activity等等。在查看日历的activity中,如果用户选择的某个事件,需要通过......
  • sqlfluff sql linter 以及自动格式化工具
    sqlfluffsqllinter以及自动格式化工具,支持多数据库方言,以及模版代码,比较适合ELT类型的数据分析应用,同时对于dbt也是比较友好的特性多种数据库方言支持支持模版(jinja,dbt)可以很好的集成ci/cddbt参考效果因为dbt使用了jinja模版引擎,同时sqlfluff提供了dbt的模版包......
  • linux mint (ubuntu)下安装Rime输入法
    linuxmint(ubuntu)下安装Rime输入法清理fctix输入法框架的其他依赖rm-rf$HOME/.config/fcitx安装Rime输入法sudoaptinstallfcitx-rimelibrime-*修改配置文件,将输入法设置为小鹤双拼mkdir-p$HOME/.config/fcitx/rime&&cd$HOME/.config/fcitx/rimeecho......
  • 阅读笔记 An introduction to inertial navigation
    摘要小巧轻量的MEMS惯性传感器最*在性能上的提升,使得惯性技术可以应用到诸如人体运动捕获这样的领域。这使得对惯性导航的研究兴趣被激发,然而目前对这个主题的导论都没有充分讲清楚惯性系统的误差特性(errorcharacteristic)。引言这是一篇剑桥大学OliverJ.Woodman写的技术报告......