将静态结构添加到作为函数参数的数组

时间:2019-06-08 16:22:16

标签: c arrays pointers parameters

如果我在main()函数中声明一个数组并将该数组作为参数发送到函数中,我可以向该数组中添加不是使用malloc创建的指针的元素吗?

我了解到,在函数中创建的静态变量被放到栈中,并且从函数返回后变得不可靠。但是,由于该数组被初始化为main()中的静态数组,因此从helper函数返回后应该保留该数组中的内存位置,不是吗?

typedef struct test_t {
    int x,y;
} test;

void fillArray(test arr[], int length) {
    int i;
    for (i=0; i<length; i++) {
        arr[i] = (test){i,i*3}
    }
    return;
}

void main() {
    test arr[5];
    fillArray(arr, 5);
    int i;
    for (i=0; i<5; i++) {
        printf("(%d,%d)\n", arr[i].x, arr[i].y);
    }
}

我希望这个玩具示例能够正常运行,因为没有发生太多事情,但这是技术上未定义的行为还是这样安全?

1 个答案:

答案 0 :(得分:0)

在大多数情况下(*)数组都转换为指向其第一个元素的指针。

在您的情况下,当数组test arr[5]用作函数参数时,将转换为指向类型为&arr[0]的第一个元素(指向test*)的指针。指向对象的内容是可变的,并且当控制权返回到main()时,它们保留更改。

您的代码唯一的三件事是

  1. 缺少#include <stdio.h>
  2. void main()应该是int main(void)
  3. ;for的正文中缺少fillArray()

(*)例外是当数组用作sizeof&运算符的参数时,或者当它是用于初始化数组对象的字符串文字时。