通过指针将字符串复制到struct

时间:2016-02-29 10:58:23

标签: c++ string struct

以下代码有一些非常奇怪的行为:

当选择= 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;
}

发生了什么事?

3 个答案:

答案 0 :(得分: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(name [selected])返回指针“name [selected]”的大小。你需要字符串的长度,你可以使用strlen函数获得该长度。

答案 1 :(得分:2)

sizeof将只返回指针的大小

您可以使用strlenstrlen

答案 2 :(得分:1)

name[chosen]的类型始终为char *,而sizeof(char*)可能为4或8(取决于平台)。由于您的分配太小,strcpy()将覆盖未分配的内存,从而导致未定义的行为。