首先,请不要在有问题时更新代码来修复错误。它使当前的大多数答案变得毫无意义,不会因解决您先前代码中的一个或多个问题的人而给予信任,并使寻找与自己相关的问题的普通读者完全困惑通过其中的问题和答案。如果您想修改原始问题之外的更新,但如果它是一个完全不同的问题,则标记为已回答,在到期时给予信用,并使用您的新代码和其他问题打开一个新问题(s )(理想情况下,无论如何)。
如现在所写,您的功能很好。但你真正的问题是:
// compile with -Wall -Werror and look at the warning here
int v={10,12,20,34,45}; // <== WRONG
getelements(&v,5); // <== Harmless, but bad form.
这应该是这样的,假设您要打印数组中的所有元素:
int v[] = {10,12,20,34,45};
getelements(v, sizeof(v)/sizeof(v[0]));
请注意[]
以下您的数组。没有它,&v
编译器将掩盖int
作为int *
. 此外,如果您在编译之前的代码时将完整的警告视为错误(-Wall -Werror
对于 gcc),您将在v
声明行中收到如下错误:
main.c:116:15: Excess elements in scalar initializer
换句话说,第一个元素之后的所有内容都被忽略了,因此您的指针正在运行到未定义的行为区域。将声明和调用更改为我上面的内容将解决这个问题,并确保您不会再犯该错误,因为除非是数组或指针类型,否则sizeof(v[0])
甚至不会编译。v
当您使用指针而不是数组进行这样的计算时,后者仍然会引起头痛,但这是您必须约束自己不要在 C 中做的事情。