2016-02-29 58 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