【问题标题】:Adding static structs to an array that is a function parameter将静态结构添加到作为函数参数的数组
【发布时间】:2019-06-08 16:22:16
【问题描述】:

如果我在 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);
    }
}

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

【问题讨论】:

  • 你需要#include &lt;stdio.h&gt;void main() 应该是int main(void)。除此之外(以及缺少的;)没关系。
  • 这里没有静态数组。
  • @AnttiHaapala 我对静态数组和动态数组的理解是它们存储在内存中的位置。 dynamic = heap (malloc), static = stack(任何不涉及任何 alloc 函数的初始化)。我的理解缺陷在哪里?
  • port70.net/~nsz/c/c11/n1570.html#6.2.4 - 静态存储持续时间适用于具有非线程局部变量的外部、内部链接的文件范围标识符,以及具有 static 关键字的其他范围内的所有变量。您的数组是main 中的自动变量。

标签: c arrays pointers parameters


【解决方案1】:

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

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

你的代码只有 3 个问题是

  1. 缺少#include &lt;stdio.h&gt;
  2. void main() 应该是 int main(void)
  3. for 内部fillArray() 内部缺少;

(*) 例外情况是数组用作sizeof&amp; 运算符的参数,或者它是用于初始化数组对象的字符串字面量。

【讨论】:

  • "指向对象的内容是可变的,当控制返回到 main() 时,它们会保留更改。"因此,即使我在辅助函数中创建结构(并且它们不是用 malloc 创建的),它们在 main() 中仍然是安全的,因为它们被存储在放在 main() 上的内存位置中堆栈?
  • 您使用 声明 test arr[5];main() 中创建结构。此时它们的 是不确定的(arr 元素尚未初始化),只要您不使用这些值,这是完全有效的。如果有效地为它们分配值,您所说的是创建结构。 一些(许多(大多数(全部?)))编译器将堆栈用于main() 的变量,但 C 标准不要求使用(或存在)“堆栈” .
  • ahhhhhhh 我很笨,我什至没有想到实际的结构是用数组创建的。谢谢你一直陪着我:)祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
相关资源
最近更新 更多