2011-12-16 26 views
-1

我遇到此程序的問題。這個程序基本上是將一個結構複製到char* ptr中,然後再將它複製到另一個malloc ed 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; 
} 
+2

打印`tableHeaderPage`時是否完全沒有輸出,或者你得到的東西不是你所期望的? – 2011-12-16 18:41:27

+3

你的程序不能編譯。你能否複製粘貼*精確*程序去解決你的問題?請參閱http://sscce.org/。 – 2011-12-16 18:41:51

回答

3

您通過結構字段的大小手動遞增offset,但不佔字段對齊。 tableHeaderPage的真實偏移量比您所做的要多2個字節,因爲您的數組[30]和tableHeaderPage將在4字節邊界處對齊。使用memcpy調用中的字段地址而不是嘗試手動跟蹤偏移量會更好。

0

混合地址偏移量計算;一方面是& record.field,另一方面是char [offset]。現在在一個結構中,字段可以對齊來表示4個字節的地址。這將在tableName字段後面輸入2個字節(30個字符 - > 32)。