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

标签 c arrays pointers parameters

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

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

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

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

最佳答案

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

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

您的代码唯一的 3 处错误是

  1. 失踪#include <stdio.h>
  2. void main()应该是int main(void)
  3. 失踪;for 的体内里面fillArray()

(*) 异常(exception)情况是当数组用作 sizeof 的参数时或&运算符或当它是用于初始化数组对象的字符串文字时。

关于c - 将静态结构添加到作为函数参数的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508130/

相关文章:

c++ - 将 QString 转换为 QString 的指针

c++ - 动态内存分配给指向对象的指针数组

c# - 想要使用 C# 中的编码获取字符串数组作为 C 函数的输出

c++ - 当存储新元素时,二维数组会删除元素本身

c - 当 sig 0 发送到 TARGET REAL UID == CURRENT EFFECTIVE UID 的进程时,kill 的返回值是多少?

c++ - FALSE 和 TRUE 的奇怪定义,为什么?

c++ - 当我在函数参数中使用指针时遇到错误

c# - 反序列化数组总是为元素返回 null 但适用于属性

jquery - 如何在 Jquery 中搜索数组,如 SQL LIKE %value% 语句

c - 为什么 printf() 允许这个 double 通过指针传递?