以下代码有一些非常奇怪的行为:
当选择= 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;
}
发生了什么事?
答案 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将只返回指针的大小
您可以使用strlen
。
strlen
答案 2 :(得分:1)
name[chosen]
的类型始终为char *
,而sizeof(char*)
可能为4或8(取决于平台)。由于您的分配太小,strcpy()将覆盖未分配的内存,从而导致未定义的行为。