C ++ strcpy非常量表达式作为数组绑定

时间:2010-01-24 17:25:38

标签: c++ arrays pointers character

我在C#,PHP和其他东西很长一段时间后又回到了C ++,我发现了一些奇怪的东西:

temp.name = new char[strlen(name) + strlen(r.name) + 1];

这个编译

temp.name = (char *)malloc(sizeof(char[strlen(name) 
     + strlen(r.name) + 1]));

这不是(temp.name是char *)

编译器错误是

  

错误C2540:非常量表达式   作为数组绑定

有谁知道问题可能是什么以及如何解决?谢谢。

3 个答案:

答案 0 :(得分:6)

sizeof(...)期望一个恒定的编译时表达式。 strlen不是编译时表达式,它是一个需要执行才能获得结果的函数。因此,编译器无法为声明如下的数组保留足够的存储空间:

char c[strlen("Hello")];

虽然字符串的长度显然为5,但编译器不知道。

为避免这种陷阱,请不要在此使用sizeof。代替:

char* c = (char*)malloc(strlen(name)+strlen(rname)+1);

这为您提供了一个指向n个字节的指针。 sizeof(char)==1始终为true,因此缓冲区中的字节数等于可以存储在其中的字符数。对于不同类型的malloc数组,乘以一个数组元素的静态大小:

int* c = (int*) malloc(sizeof(int)*100);

这没关系,因为sizeof应用于编译时表达式。当然,C ++方式更清晰:

int* c = new int[100];

答案 1 :(得分:1)

问题是char[...]这是一种数组类型,而在C ++(和C89)中,数组大小需要是编译时常量。您可能应该使用std :: string而不是new[]malloc()手动分配内存,但如果您更喜欢使用手动分配,请直接将大小计算为字符数而不是使用数组和sizeof要做到这一点。

答案 2 :(得分:0)

malloc需要size_t作为输入,这意味着您需要计算实际大小并将其传递而不是指定类型:

temp.name = (char *) malloc( (strlen(name) + strlen(r.name) + 1)) * sizeof(char));

无论如何你应该使用new,所以我没有看到任何真正的问题。