我能做到这一点在C:静态分配数组作为C函数参数
void myFunc(int *vp) {
// do some stuff with vp
}
int main() {
int v[5] = {1,2,3,4,5};
myFunc(v);
return 0;
}
我的意思是,这将是正确的? myFunc(& v); ?
谢谢!
我能做到这一点在C:静态分配数组作为C函数参数
void myFunc(int *vp) {
// do some stuff with vp
}
int main() {
int v[5] = {1,2,3,4,5};
myFunc(v);
return 0;
}
我的意思是,这将是正确的? myFunc(& v); ?
谢谢!
当您将它们作为参数传递时,数组衰减为指针。但是,数组衰减与获取数组地址不同。
“衰退”是如何将某些类型作为函数参数传递时进行转换。即使v
的类型为int [5]
,但在将其传递给函数时,它将变为int*
。这是很多人不喜欢的行为,但没有关系。
请注意,另一方面,&v
的类型是int (*)[5]
,也就是指向一个由5个整数组成的数组的指针。这种类型不会衰减,也就是说,如果将它作为函数参数传递,它不会自动转换为另一种类型(并且这也是为什么在您的示例中使用它时不起作用,因为您需要一个指针整数,而不是一个整数数组的指针)。
“正确”的事情(假设衰退是好的)就是做myFunc(v)
,就像你在你的代码片段中做的那样。请记住,当你这样做时,你会失去数组边界信息。
是的......你的代码是正确的。
这里v==&v[0]
阵列名称等于阵列
myFunc(v);
传递数组名作为参数,这意味着要传递第一元件的地址在阵列的第一个元素的地址。
void myFunc(int *vp)
这里您使用的是指针。它存储了传递的数组的第一个元素的地址,以便您可以通过增加指针位置来访问数组所覆盖的块。
而且
myFunc(&v);
&v==&&v[0];
& v是阵列的第一元件的地址的地址。
现在
void myFunc(int *vp)
在这里,你得到了数组第一个元素的地址,这不是指向数组的地址。而是指向一些内存位置。现在,您不能通过增加指针来访问数组。
你的代码是正确的它会工作.... 但你应该格外小心检查边界条件。 请仔细查看代码。
void myFunc(int *vp) {
vp[5] = 30;
}
int main() {
int v[5] = {1,2,3,4,5};
int a = 10;
printf("Value of a before fun call %d\n", a);
myFunc(v);
printf("Value of a before fun call %d\n", a);
return 0;
}
同样
void myFunc(int *vp) {
vp[5] = 30;
myFunc2(vp);
}
void myFunc2(int *vp) {
vp[6] = 30;
}
int main() {
int v[5] = {1,2,3,4,5};
int a = 10;
printf("Value of a before fun call %d\n", a);
myFunc(v);
printf("Value of a before fun call %d\n", a);
return 0;
}
这将导致由于堆栈curruption段故障。由于局部变量处于堆栈状态。
你问是因为你有错误还是询问它是否一致? – Ryan
试试吧。运行。也许它有效。无论哪种方式,你学到了一些东西。 :) – Bucket
是的!我似乎工作。当我在VS2012上运行它时,一切看起来都很好。但是当我在Linux上运行它时,出现了分段错误。我不知道这是否是问题。经过4个小时的计算,我得到了分段错误。我问,因为我怀疑这可能是问题所在。 –