我正在学习动态内存分配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);
}
如果您的用户输入大量数据,则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的强制部分,这意味着并非所有符合要求的实现都需要支持它。
在尝试查看代码工作原理之后,经过仔细检查,我可以看到您填充数组并立即重用该值。所以,你不关心它是否被破坏。实际上,您根本不需要阵列。下面的代码也可以工作,甚至不假装使用数组。
#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);
}
对于持续程序生命周期的指针,通常需要使用malloc
/ free
,但是在这种情况下,由于你在main
函数中完成所有工作,所以它并不重要。这两个代码示例都做同样的事情并产生相同的结果。
无论如何,C中的数组只是动态分配的指针。