gpt4 book ai didi

c - 在理解 C 中的内存分配时遇到了一些麻烦

转载 作者:行者123 更新时间:2023-12-04 01:25:32 24 4
gpt4 key购买 nike

所以我正在学习如何用 C 编程,并开始学习动态内存分配。我所知道的是,并非所有时间您的程序都知道它在运行时需要多少内存。

我有这个代码:

#include <stdio.h>

int main() {
int r, c, i, j;
printf("Rows?\n");
scanf("%d", &r);
printf("Columns?\n");
scanf("%d", &c);

int array[r][c];
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
array[i][j] = rand() % 100 + 1;

return 0;
}

因此,如果我想创建一个 2D 数组,我只需声明一个并将数字放在括号中即可。但是在这段代码中,我问用户他们想要多少行和列,然后用这些变量声明一个数组,然后用随机整数填充行和列。

所以我的问题是:为什么我不必使用类似 malloc 的东西?这里?我的代码不知道我将在运行时放入多少行和列,那么为什么我可以使用当前代码访问该数组?

最佳答案

So my question is: why don't I have to use something like malloc here? My code doesn't know how many rows and columns I am going to put in at run time, so why do I have access to that array with my current code?



您正在使用称为“可变长度数组”的 C 功能。它是在 C99 中作为强制性功能引入的,但在 C11 和 C18 中对它的支持是可选的。这种动态分配的替代方法有几个限制,其中包括:
  • 由于该功能是可选的,无条件依赖它的代码不可移植到不支持该功能的实现
  • 支持 VLA 的实现通常将本地 VLA 存储在堆栈上,如果在运行时数组维度很大,这很容易产生堆栈溢出。 (动态分配的空间通常对此类问题不太敏感。大型、固定大小的自动数组也可能是一个问题,但这些问题的潜在问题在源代码中很明显,并且不太可能在执行过程中逃避检测测试。)
  • 程序在声明之前仍然需要知道数组的维度,并且声明点的维度在数组的生命周期内是固定的。与动态分配的空间不同,VLA 不能调整大小。
  • 有些上下文可以容纳普通的、固定长度的数组,但不能容纳 VLA,例如文件范围变量。
  • 关于c - 在理解 C 中的内存分配时遇到了一些麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61995087/

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