2016-02-29 60 views
-1

下面的代碼有一些真正奇怪的行爲:將字符串複製到結構通過指針

當選擇= 0時,它返回-1073741819。

當選擇= 1時,它會運行但輸出字符串會混亂。

#include <iostream> 
#include <cstring> 
using namespace std; 

char* name[2] = {"WithoutSpaces","With spaces"}; 
struct entity{ 
    char* name; 
}; 
struct entity *foo1, *foo2; 

int main(void){ 
    foo1 = new entity; 
    foo2 = new entity; 
    int chosen = 1; 

    foo1->name = new char[sizeof(name[chosen])+1]; 
    strcpy(foo1->name,name[chosen]); 

    foo2->name = new char[sizeof(name[chosen])+1]; 
    strcpy(foo2->name,name[chosen]); 

    cout << foo1->name <<endl; 
    cout << foo2->name <<endl; 
    return 0; 
} 

發生了什麼事?

+6

'name [selected]'是一個指針。 'sizeof'指針不是你在這裏需要的。你需要找出一個字符串的長度。但嚴重的是,請改用'std :: string'。 – juanchopanza

+0

不要在C++中使用char * anc C數組 –

+0

您忘記取消分配動態分配的所有內存。 – user2079303

回答

3

,您應該使用的

foo1->name = new char [strlen(name[chosen]) + 1]; 
strcpy(foo1->name, name[chosen]); 

代替

foo1->name = new char[sizeof(name[chosen])+1]; 
strcpy(foo1->name,name[chosen]); 

因爲的sizeof(名稱[選擇])將返回指針的大小 「的名字[選擇]」。而且你需要字符串的長度,你可以用strlen函數得到這個長度。

1

name[chosen]的類型總是char *sizeof(char*)可能是4或8(取決於平臺)。由於您的分配太小,strcpy()將覆蓋未分配的內存,導致未定義的行爲。

+0

你的意思是sizeof(char *)? –

+0

錯......是的。它這樣說,對吧? –

+0

@ H.Guijt:現在確實(現在Mat已經修改了標記),但之前,你的'*'字符被當作「斜體」標記。 –

2

的sizeof只返回指針

你可以使用strlen的大小。 strlen