加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – std :: copy导致错误,无异常

发布时间:2020-12-16 09:58:52 所属栏目:百科 来源:网络整理
导读:我有这个代码来复制一个整数: int parseInt(const char* data,unsigned int* ind) { int i; std::copy(data[*ind],data[*ind+sizeof(int)],i); // i) STD::COPY // memcpy(i,data[*ind],sizeof(int)); // ii) MEMCPY std::cout "-- " i std::endl; *ind +=
我有这个代码来复制一个整数:

int parseInt(const char* data,unsigned int* ind) {
    int i;

    std::copy(&data[*ind],&data[*ind+sizeof(int)],&i); // i) STD::COPY
    // memcpy(&i,&data[*ind],sizeof(int)); // ii) MEMCPY
    std::cout << "--> " << i << std::endl;
    *ind += sizeof(int);
    std::cout << "OK" << std::endl;
    return i;
}

在debian上,这段代码可以正常工作i)STD :: COPY.

然后,我编译并运行嵌入式Arm上的代码(sizeof(int)也是4).带有i)的代码似乎也在运行,在函数内打印预期.

但是,从函数返回时会导致问题.

我试过也回1;而不是我,但相同.它没有抛出异常,也没有给出任何线索.我无法调试,因为我无法添加调试器,因为我有限制.

它只是在这个功能之后才会继续,即:

std::cout << "PARSING..." << std::endl;
parseInt(data,&ind);
std::cout << "PARSED!" << std::endl;
...

给出这个(值11是正确的):

PARSING...
--> 11
OK

然后这个过程冻结了.

但是,当我使用ii)MEMCPY而不是std :: copy时,代码可以工作.因此,由于std :: copy,我似乎出现了这个问题.

有谁知道这里可以发生什么?

我是否错误地使用std :: copy?但那么为什么它适用于debian桌面而不是arm on embedded?

解决方法

std::copy(&data[*ind],&i);

这将sizeof(int)字节复制到从& i开始的int数组的连续元素,不用说这导致未定义的行为,因为在& i处没有数组.

你可能意味着

std::copy(&data[*ind],reinterpret_cast<char*>(&i));

memcpy工作的原因是因为它显式地复制了字节,std :: copy比它在抽象迭代器上运行的其他标准算法更通用,由你决定是否正确调用它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读