在C中堆栈类型的脚印

时间:2009-10-06 12:51:06

标签: c arrays stack

我有以下功能

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个字节的数组?

5 个答案:

答案 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);
}