我有以下功能
void DoSomething(int start[10], int end[10])
当我通过
打电话时void Do(void)
{
int start[10] = {1,2,3,4,5,6,7,8,9,0};
int end[10] = {1,2,3,4,5,6,7,8,9,0};
DoSomething(start,end);
}
我在堆栈上放了两个指针(8个字节都在一起)还是两个40个字节的数组?
答案 0 :(得分:7)
在C中,函数的数组参数实际上是指针,所以你在堆栈上放两个指针,没有数组的副本。
与DoSomething
的签名相同:
void DoSomething(int *start, int *end);
答案 1 :(得分:1)
数组在C中衰减成指针。你将开始和结束的第一个元素的地址放在堆栈上。
答案 2 :(得分:1)
按值传递数组,将它们放在结构中,即(伪代码):
struct int10 {
int arr[ 10];
};
void DoSomething( struct int10 start, struct int10 end);
void Do(void) {
struct int10 start;
struct int10 end;
...
DoSomething( start, end);
}
答案 3 :(得分:0)
您将数组值放在Do
中的自动存储(通常在堆栈中),但仅将指向这些数组的指针作为DoSomething
的参数传递。
参数是在堆栈上传递还是作为寄存器传递取决于您的环境ABI。如果体系结构将参数作为寄存器传递,并且调用由编译器内联,并且DoSomething
不需要任何变量,则DoSomething
可能不会使用任何堆栈。相反,某些体系结构总是在堆栈上传递参数,而某些编译器不会内联,在这种情况下,堆栈将使用参数值作为数组的地址,以及其他状态(如返回地址)。
答案 4 :(得分:0)
您正在将指针传递给被调用的函数。
void DoSomething(int start[10], int end[10]) {
int x=0, k=10;
while (k--) x += *(start++) * *(end++);
if (x == 285) {
/* OK: 1*1 + 2*2 + 3*3 + ... + 9*9 is 285 */
}
}
void Do(void) {
int start[10] = {1,2,3,4,5,6,7,8,9,0};
int end[10] = {1,2,3,4,5,6,7,8,9,0};
DoSomething(start, end);
}