【发布时间】:2017-11-11 02:31:04
【问题描述】:
我正在尝试创建一个简单的数组扩展函数,该函数创建一个新数组,其值与前一个数组相同,但扩展了一个值:
char* test(char array[], int expandBy) {
char newArray[sizeof(array) + expandBy];
strncpy(newArray, array, sizeof(array));
return newArray;
}
但是,我收到了编译时错误expression must have a constant value。我看到的所有类似问题的答案都建议使用宏,但如果我事先不知道值,我就不能使用宏。
有谁知道我该如何解决这个问题,或者是否有替代方法?
【问题讨论】:
-
你有一个比编译器错误更严重的问题:你返回一个指向局部变量的指针。一旦函数返回,局部变量就会超出范围,这会给您留下一个指向不再存在的数组的流浪指针。尝试取消引用返回的指针将导致 undefined behavior。
-
在另一个不相关的注释中,有
strncpy不会添加终止符的情况。请注意这一点。 -
一旦将数组传递给函数,它就会衰减为指针。此时 sizeof 告诉您指针的大小,而不是数组的长度。如果它是一个以空结尾的字符串,您可以使用 strlen 来查找内容的长度,但这可能不是实际数组的长度。 stackoverflow.com/questions/492384/…
-
@Someprogrammerdude:实际上重要的是
newArray对象的生命周期,而不是其名称的范围。范围是其中 name 可见。生命周期是当一个对象存在时。 -
顺便说一句,我怀疑 OP 没有用现代标准 C 版本编译它。我在他们的代码中没有看到任何会产生关于常量值的错误的表达式。但是,如果他们使用不支持可变长度数组的 C 版本,他们会在
newArray声明中收到该错误,因为它使用维度的运行时值。所以 OP 得到错误的原因实际上与sizeof(array)不产生“数组”的大小这一事实无关。