Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构中的字符问题_C++ - Fatal编程技术网

C++ 结构中的字符问题

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

我对这个计划有意见。这个程序基本上是将一个结构复制到一个char*ptr中,然后再次将它复制到另一个malloced ptr中并读取它。问题是它不会打印最后一个

#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。。它不起作用