如果存在 VLA,为啥仍然需要 malloc? [复制]

Posted

技术标签:

【中文标题】如果存在 VLA,为啥仍然需要 malloc? [复制]【英文标题】:why is malloc still needed if VLAs exist? [duplicate]如果存在 VLA,为什么仍然需要 malloc? [复制] 【发布时间】:2021-01-24 04:20:58 【问题描述】:

众所周知,有两种类型的数组,静态的和动态的。静态数组大小在编译时定义,动态数组大小使用 malloc 定义。在这段代码中你可以看到我没有使用 malloc 并且我正在处理动态数组并且我的所有数组的操作都在运行。

int main()

    int capofarr,sizeofarr,i,choice,choice2,ele,pos,choice3;
    printf("enter the size of array:");
    scanf("%d",&capofarr);
    int arr[capofarr];
    printf("Enter the element that you want to store in array:");
    scanf("%d",&sizeofarr);
    if(capofarr>=sizeofarr)
    
    
    for(i=0;i<=sizeofarr-1;i++)
    
    printf("Enter value of arr[%d]=",i+1);
    scanf("%d",&arr[i]);
    

【问题讨论】:

您定义的是一个可变长度数组 (VLA)。如果您的问题是“如果存在 VLA,为什么仍然需要 malloc?”,一个很好的理由是 malloc 从堆中提供内存,这意味着它可以传递给其他函数,这是局部变量无法做到的。 VLA 不能替代动态分配的内存 (malloc/calloc/realloc)。它们是最近添加到可选语言的语言,并非在所有实现中都存在。它们不如动态内存有用 - VLA 在定义后无法调整大小,它们不能是 structunion 类型的成员,它们不能在文件范围内定义,并且在大多数实现中它们的大小非常有限.这就像将凿子与螺丝刀进行比较——两者都很有用,但用途却截然不同。 【参考方案1】:

是的,您的所有操作都在运行,但 malloc 的目的是分配所需的内存量,以免浪费内存。但在你的情况下,我的情况是(capofarr > sizeofarr)内存被浪费了,即。浪费的内存大小为 (capofarr-sizeofarr)*sizeof(a[0])。如果我错了,请纠正我。谢谢

【讨论】:

如果用户输入数组 5 的大小并且想只使用 2 而不是全部 5 那么 3 remaning 是浪费内存吗? 他总是可以决定以后使用它,我不明白它是如何“浪费”内存。您可以选择为 5 个 int 分配空间,也可以只使用 3 个与动态内存。 @Silidrone yaa 理解 thnx @Rohanjangid 数组中未使用的索引将存储垃圾值,这在大型程序的情况下会增加时间复杂度并减慢编译速度。谢谢。

以上是关于如果存在 VLA,为啥仍然需要 malloc? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥零长度 VLA 是 UB?

为啥尽管我在变量中使用 malloc 分配更多内存,但当我打印变量的大小时,它仍然显示更少的内存/字节? [复制]

为啥对函数的 VLA 数组参数使用星号“[*]”而不是整数?

为啥在 C 中需要使用 malloc 进行动态内存分配?

使用指针来实现变长数组(VLA)

为啥 malloc() 基于链表?