将值存储在指针变量中

Store value in pointer var

本文关键字:变量 指针 存储      更新时间:2023-10-16

如何在*pData中存储int值并显示其中的值?

  int id = 12;
  int age = 14;
  unsigned char* pData = new unsigned char[8];
  memcpy(pData,&id,4);/* using memcpy to copy */
  pData = pData + 4;
  memcpy(pData,&age,4);/* using memcpy to copy */
  // How to print value from buffer *pData

使用memcpyint的字节复制到无符号字符缓冲区后,显示int的唯一正确方法是将字节复制回int。例如:

int temp_int;
memcpy(&temp_int, pData, sizeof temp_int);
std::cout << temp_int << 'n';
memcpy(&temp_int, pData + sizeof temp_int, sizeof temp_int);
std::cout << temp_int << 'n';

试图将缓冲区重新解释为int会违反严格的混叠规则,从而导致未定义的行为。

您可以将pData更改为int*,然后打印int valve。


cout<<*((int *)pData);
memcpy(pData,&id,4);

这一行将id中的四个字节数据作为int复制到pData,但您将其声明为char*。如果您将其声明为int*pData=new int[2];那么你就可以得到精确的值。

 using namespace std;
 int id = 12;
 int age = 14;
 unsigned int* pData = new unsigned int[2];
 memcpy(pData,&id,4);
 pData = pData + 1;
 memcpy(pData,&age,4);
 pData = pData - 1;
 cout<<"ID:"<<pData[0]<<"nAge:"<<pData[1]<<endl;

这将打印值。

如果您真的需要将内存分配为unsigned char*,您可以如下所示:

#include <iostream>
#include <cstring>
using namespace std;
int main() {
    int id = 12;
    int age = 14;
    // const pointer to buffer which can contain 2 ints
    unsigned char* const pData = new unsigned char[2*sizeof(int)];
    // non-const pointer to operate on data
    unsigned char* pDataPtr = pData;
    memcpy(pDataPtr,&id,sizeof(int));
    pDataPtr += sizeof(int);
    memcpy(pDataPtr,&age,sizeof(int));
    std::cout<<*reinterpret_cast<int*>(pData)<<std::endl;
    std::cout<<*reinterpret_cast<int*>(pData + sizeof(int))<<std::endl;
    delete [] pData;
    return 0;
}

您可以使用interpret_cast运算符打印pData:

#include <iostream>
#include <cstring>
int main(void)
{
    int id = 12;
    int age = 14;
    const size_t size = sizeof(int);
    unsigned char* pData = new unsigned char[2*size];
    memcpy(pData,&id,size);/* using memcpy to copy */
    pData = pData + size;
    memcpy(pData,&age,size);/* using memcpy to copy */
    std::cout<<*reinterpret_cast<int*>(pData)<<std::endl;
    pData = pData - size;
    std::cout<<*reinterpret_cast<int*>(pData)<<std::endl;
    delete []pData;
    return 0;
}