C++ 结构中的字符问题
我对这个计划有意见。这个程序基本上是将一个结构复制到一个char*ptr中,然后再次将它复制到另一个malloced ptr中并读取它。问题是它不会打印最后一个C++ 结构中的字符问题,c++,C++,我对这个计划有意见。这个程序基本上是将一个结构复制到一个char*ptr中,然后再次将它复制到另一个malloced ptr中并读取它。问题是它不会打印最后一个 #include<stdio.h> #include<iostream> #include<malloc.h> #include<string> #include<string.h> using namespace std; typedef struct { int tab
#include<stdio.h>
#include<iostream>
#include<malloc.h>
#include<string>
#include<string.h>
using namespace std;
typedef struct
{
int tableId;
char tableName[30];
int tableHeaderPage; // NOT GETTING PRINTED
}sysTable;
int main()
{
sysTable record;
record.tableId=11;
strcpy(record.tableName,"babyyy");
record.tableHeaderPage=56;
char *recChar=(char*)malloc(sizeof(sysTable)+1);
memcpy(recChar,&record,sizeof(record));
char *recChar2=(char*)malloc(sizeof(sysTable)+1);
memcpy(recChar2,recChar,sizeof(record));
sysTable record2;
int offset=0;
memcpy(&record2.tableId,&recChar[offset],sizeof(record2.tableId));
offset+=sizeof(record2.tableId);
memcpy(&record2.tableName,&recChar[offset],sizeof(record2.tableName));
offset+=sizeof(record2.tableName);
memcpy(&record2.tableHeaderPage,&recChar[offset],sizeof(record2.tableHeaderPage));
cout<<"\n Record Details\n";
cout<<"\n table Id: "<<record2.tableId;
cout<<"\n table Name: "<<record2.tableName;
cout<<"\n tableHeaderPage: "<<record2.tableHeaderPage; // PROBLEM THIS IS NOT PRINTING PROPERLY.
return 0;
}
您正在按结构字段的大小手动增加偏移量,但不考虑字段对齐。tableHeaderPage的实际偏移量将比您正在执行的操作多2个字节,因为您的数组是[30],tableHeaderPage将以4字节边界对齐。最好在memcpy调用中使用字段的地址,而不是尝试手动跟踪偏移量。您可以混合使用地址偏移量计算;一方面是&record.field,另一方面是char[offset]。现在,在结构中,字段可以对齐为4字节地址。这将在tableName字段30个字符->32后插入2个字节。打印tableHeaderPage时,您是根本没有得到任何输出,还是得到了与预期不符的结果?您的程序无法编译。你能复制粘贴说明你问题的精确程序吗?请参阅。@Rob-它不是因为OP试图将tableHeaderPage用粗体显示而编译的吗?我的建议是,确保数组已正确初始化:memsetrecord.tableName,0,sizeofrecord.tableName;现在您知道数组的最后一个元素有一个空字符。@TedHopp:问题在于某个变量的值,而不是格式化和打印的机制。如果你在最后一个memcpy之前添加它,你可以看到:cout Ya,但给定它为memcpy&record2.tableName,&recChar[offset],sizeofchar*&record2.tableHeaderPage-char*&record2。。它不起作用