我可以使用此代码而不是malloc函数,因为它似乎与C语言中的动态内存分配相同

问题描述 投票:1回答:3

我正在学习动态内存分配c语言,我发现使用malloc函数的下面的代码,但是我可以在不使用malloc函数的情况下将代码最终用于相同目的。两个代码给出相同的输出

//使用malloc函数的代码

#include<stdio.h>
#include<malloc.h>
int main(){
    int *ptr;
    int n,sum=0;
    printf("Enter the size of array \n");
    scanf("%d",&n);
    ptr=(int*)malloc(n*sizeof(int));
    if (ptr==NULL)
    {
        printf("Memory not allocated \n");
    }
    else
    {
        for (int i = 0; i < n; ++i)
        {    
            printf("Enter element at %d position \n",i+1);
            scanf("%d",(ptr+i));
            sum=sum+(*(ptr+i));
        }
        printf("sum = %d",sum);
    }
}

//不使用malloc函数的代码

#include<stdio.h>
int main(){
    int n,sum=0;
    printf("Enter the size of array \n");
    scanf("%d",&n);
    int a[n];
    for (int i = 0; i < n; ++i)
    {    
        printf("Enter element at %d position \n",i+1);
        scanf("%d",&a[i]);
        sum=sum+a[i];
    }
    printf("sum = %d",sum);
}
c dynamic-memory-allocation
3个回答
2
投票

如果您的用户输入大量数据,则VLA(=可变长度数组)方法可能会导致堆栈溢出。

你可以通过限制大小来解决这个问题,如果用户请求过大的值,则使用malloc,但在这种情况下实现这样的双重分配策略似乎是不必要的复杂化。

这对malloc来说更简单。


限制VLA大小的示例:

....
enum { MAX_CNT = 128 };
int a[n <= MAX_CNT ? n : 1];
int *ptr = a <= MAX_CNT ? &a[0] : malloc(int[n]);
if(!ptr){ printf("Memory not allocated \n"); return -1; }
//...
//...
if (a!=ptr) free(ptr);

VLA方法的好处是比malloc更快,并且具有更好的缓存局部性(这些在你所显示的程序中并不重要)。

另一方面,VLA功能不是C的强制部分,这意味着并非所有符合要求的实现都需要支持它。


0
投票

在尝试查看代码工作原理之后,经过仔细检查,我可以看到您填充数组并立即重用该值。所以,你不关心它是否被破坏。实际上,您根本不需要阵列。下面的代码也可以工作,甚至不假装使用数组。

#include<stdio.h>
int main(){
    int n,sum=0;
    printf("Enter the size of array \n");
    scanf("%d",&n);
    for (int i = 0; i < n; ++i)
    {    
        printf("Enter element at %d position \n",i+1);
        int v;
        scanf("%d",&v);
        sum=sum+v;
    }
    printf("sum = %d",sum);
}

-2
投票

对于持续程序生命周期的指针,通常需要使用malloc / free,但是在这种情况下,由于你在main函数中完成所有工作,所以它并不重要。这两个代码示例都做同样的事情并产生相同的结果。

无论如何,C中的数组只是动态分配的指针。

© www.soinside.com 2019 - 2024. All rights reserved.