我在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:非常量表达式 作为数组绑定
有谁知道问题可能是什么以及如何解决?谢谢。
答案 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
,所以我没有看到任何真正的问题。