2015-10-08 17 views
-2

以下代碼用於測試將char *字符串強制轉換爲類指針時會發生什麼。在這個類中有三個字符串數據和一個整數。當我將該類打印爲字符串格式時,數據按預期列出。但是我怎樣才能知道這個類中變量的價值?爲什麼會發生這種情況?類和字符之間的強制轉換*

#include<stdio.h> 
#include<iostream> 
using namespace std; 
class IndexInfo 
{ 
public: 
    IndexInfo(string i,string t,string a,int ty) 
    {indexName = i;tableName = t;Attribute = a;type = ty;} 
    string indexName; 
    string tableName; 
    string Attribute; 
    int type; 
}; 

int main(){ 
    string a = "1234567890"; 
    printf("%ld",sizeof(a)); 
    printf("%ld",sizeof(string)); 
    char *b = "asdfghjkl1234567890"; 
    IndexInfo * c = (IndexInfo *) b; 
    //cout << (*c).indexName << endl; 
    printf("%s\n",c); 
    return 0; 

} 
+3

你對'printf'說謊。閱讀手冊以瞭解其先決條件,並且不違反先決條件。 –

+0

'* c'不是有效的'IndexInfo'實例。沒有成員變量存在。你無法知道不存在的東西的價值。 – molbdnilo

+0

@molbdnilo:'char *'允許別名的東西;我想這裏缺乏原始的建築是一種破壞行爲的方式,但我認爲這太迂腐了。如果'IndexInfo'是適合於二進制[de]序列化的類(不是),這將是一個相當合理的問題。 –

回答

0

好像你所期望的字符串asdfghjkl1234567890的內容以某種方式分配給c->indexNamec->tableNamec->Attribute

實際上這不會發生。 A string是一個擁有自己內部結構的類,不只是少數幾個char s。 string的二進制佈局是它包含指向char的指針,而不是char s。

這意味着將char*轉換爲IndexInfo*將嘗試將字符asdf重新解釋爲指向由string控制的內部緩衝區的指針。 asdf具有十六進制值61 73 64 47,因此通過投射這將意味着指針值0x66647361。由於這並不指向由string控制的內部緩衝區,所以這種轉換沒有意義。

你需要告訴我們你實際上想要達到什麼目標,那麼我們可以建議一個很好的方法來做到這一點。

相關問題