gpt4 book ai didi

c - 为什么 C 中二维数组的内容通过函数调用持久存在?

转载 作者:行者123 更新时间:2023-12-02 16:16:35 27 4
gpt4 key购买 nike

我有以下文件,我要询问的部分是 float depth_buffer[1920][1076]; 以及底部标记为“修复问题”的部分。

void draw_screen(cairo_t *cr, struct triangle_list triangles) {
struct point_3d temp_points[3];
struct point_3d projected_points[3];
float shades[3] = { 1.0, 1.0, 1.0 };
float depth_buffer[1920][1076];

cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
cairo_paint(cr);

cairo_rectangle(cr, 0.0, 0.0, 30.0, 30.0);

float d = 20;
float v_w = 160;
float v_h = 90;

projected_points[0] = project_vertex(triangles.verteces[0], d, v_w, v_h);
projected_points[1] = project_vertex(triangles.verteces[1], d, v_w, v_h);
projected_points[2] = project_vertex(triangles.verteces[2], d, v_w, v_h);

int current_triangle = 0;
float color[3];

for (int i = 0; i < triangles.num_triangles * 3; i += 3) {
for (int j = 0; j < 3; j++) {
projected_points[j] = project_vertex(triangles.verteces[i + j], d, v_w, v_h);
shades[j] = triangles.shades[i + j];
}

color[0] = triangles.colors[current_triangle].r;
color[1] = triangles.colors[current_triangle].g;
color[2] = triangles.colors[current_triangle].b;

draw_filled_triangle(cr, projected_points, shades, color, depth_buffer);

current_triangle++;
}

// Fixes issue
for (int i = 0; i < 1920; i++) {
for (int j = 0; j < 1076; j++) {
depth_buffer[i][j] = 0.0;
}
}
}

调用此函数时,depth_buffer 中的所有值都应为零。然而,当我使用调试器时,我发现 depth_buffer 的值不为零,并且似乎与上次调用它时没有链接。

当添加循环以手动将所有值设置为零时,问题就消失了。

为什么在函数结束时没有清除 depth_buffer 的内存?我应该手动清除它吗?如果是,如何清除?

最佳答案

来自 C11 标准#6.7.9p10 [已添加强调]

10 If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. ...

您尝试确保 depth_buffer 数组的方式应在随后调用 draw_screen() 函数时被清除,方法是将 0.0 分配给在从 draw_screen() 函数返回之前 depth_buffer 数组的所有元素不会帮助您,因为 depth_buffer 是一个自动变量和对象具有自动存储持续时间的对象在它们声明的 block 的生命周期内有效。 draw_screen()函数 block 中声明的depth_buffer数组,在draw_screen()函数退出时销毁。

相反,您应该在使用前用 0 初始化 depth_buffer 数组元素。要用 0 初始化 depth_buffer 数组的所有元素,您可以这样做:

float depth_buffer[1920][1076] = {{0}};

检查更多关于 C 中数组初始化的信息 here .

depth_buffer数组的大小大概在8MB左右。在堆栈上分配这么大的数组是不好的做法,应该避免。相反,为它动态分配内存。您可能想探索 C memory management library功能。

关于c - 为什么 C 中二维数组的内容通过函数调用持久存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66513258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com