代码之家  ›  专栏  ›  技术社区  ›  PVitt

C中类型数组的堆栈足迹

  •  1
  • PVitt  · 技术社区  · 15 年前

    我有以下功能

    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 回复  |  直到 15 年前
        1
  •  7
  •   Alex B    15 年前

    在C语言中,函数的数组参数实际上是指针,所以在堆栈中放置两个指针时,不会复制数组。

    就好像签名 DoSomething 是:

    void DoSomething(int *start, int *end);
    
        2
  •  1
  •   Naveen    15 年前

    数组在C中衰减为指针。您将开始和结束的第一个元素的地址放在堆栈上。

        3
  •  1
  •   dmityugov    15 年前

    要按值传递数组,请将其放入结构中,即(伪代码):

    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);
    }
    
        4
  •  0
  •   Pete Kirkham    15 年前

    将数组值放入自动存储(通常位于堆栈中)中 Do 但只将指向这些数组的指针作为参数传递给 DoSomething .

    参数是在堆栈上传递还是作为寄存器传递取决于环境的 ABI . 如果体系结构将参数作为寄存器传递,并且编译器内联调用, 剂量测定法 不需要任何变量,可能没有使用堆栈 剂量测定法 . 相反,一些架构总是在堆栈上传递参数,而一些编译器不内联,在这种情况下,堆栈将参数值作为数组的地址,以及其他状态(如返回地址)。

        5
  •  0
  •   pmg    15 年前

    您正在向被调用函数传递指针。

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