为什么将字符数组复制到结构中时 memcpy 不起作用?

Why doesn't memcpy work when copying a char array into a struct?

本文关键字:memcpy 不起作用 结构 字符 数组 复制 为什么      更新时间:2023-10-16
#define buffer 128    
int main(){
  char buf[buffer]="";
  ifstream infile("/home/kevin/Music/test.mp3",ios::binary);
  infile.seekg(-buffer,ios::end);
  if(!infile || !infile.read(buf,buffer)){
      cout<<"fail!"<<endl;
  }
  ID3v1 id3;
  cout<<sizeof(id3)<<endl;
  memcpy(&id3,buf,128);
  cout<<id3.header<<endl;
}

struct ID3v1{
  char header[3];
  char title[30];
  char artist[30];
  char album[30];
  char year[4];
  char comment[28];
  bool zerobyte;
  bool track;
  bool genre;
};

当我做memcpy时,它似乎将太多数据推送到标题字段中。我是否需要遍历每个结构成员并将数据复制到其中?我也在使用 c++,但这似乎更像是一种"C"策略。有没有更好的 c++ 方法?

如所有注释中所述(您缺少"\0"字符,或者在打印 C 字符串时运算符<<期望字符序列以"\0"结尾(。

尝试:

std::cout << std::string(id3.header, id3.header+3) << std::endl;

这将打印标题字段中的三个字符。

问题很可能在于memcpy做了它所做的事情。

它将 128 字节复制到您的结构中。

然后,您尝试打印出标题。它打印第 1 个字符、第 2 个字符、第 3 个字符。并继续打印,直到找到''(字符串终止字符(。

基本上,在打印内容时,将标头复制到另一个 char 数组并附加终止字符(或复制到 c++ 字符串(。

使用memcpy时可能遇到的其他问题:

  • 编译器可以将结构元素与单词边界对齐。大多数编译器都有一些杂注或命令行开关来指定要使用的对齐方式。
  • 某些 CPU 要求将短裤或长整型存储在字边界上,在这种情况下,修改对齐方式将无济于事,因为您将无法从未对齐的地址读取。
  • 如果你复制大于char的整数(如短或长(,你必须确保根据你的CPU架构纠正字节顺序。