如果我在 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 处错误是
- 失踪
#include <stdio.h>
-
void main()
应该是int main(void)
- 失踪
;
在for
的体内里面fillArray()
(*) 异常(exception)情况是当数组用作 sizeof
的参数时或&
运算符或当它是用于初始化数组对象的字符串文字时。
关于c - 将静态结构添加到作为函数参数的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56508130/