![](https://iknow-base.cdn.bcebos.com/lxb/notice.png)
C语言为数组动态分配内存并赋值,为什么第一种方法正确,第二种方法错误?
#include<stdio.h>#include<stdlib.h>voidmain(){inti,n,*a;scanf("%d",&n);a=(int*)malloc...
#include<stdio.h>
#include<stdlib.h>
void main()
{
int i,n,*a;
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int)); //这种方法正确
for(i=0;i<n;i++)
a[i]=i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
#include<stdio.h>
#include<stdlib.h>
void main()
{
int i,n,*a;
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=(int *)malloc(sizeof(int)); //这种方法错误
a[i]=i;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
} 展开
#include<stdlib.h>
void main()
{
int i,n,*a;
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int)); //这种方法正确
for(i=0;i<n;i++)
a[i]=i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
#include<stdio.h>
#include<stdlib.h>
void main()
{
int i,n,*a;
scanf("%d",&n);
for(i=0;i<n;i++)
{
a=(int *)malloc(sizeof(int)); //这种方法错误
a[i]=i;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
} 展开
6个回答
展开全部
只分析错的:编译时不会报错,但是逻辑上有问题,达不到目的,malloc()函数是在堆栈中分配的内存,即使在for循环中你也不能确定它是按顺序给你分配的空间,而且for循环每一次执行的时候,你都给出了a[]数组的首地址,所以只有for循环最后一次分配的才是你得到的最终的a[]的首地址,当然,你分配的空间只能装一个整数,i>0之后就出界了,即使编译器不进行边界检测不报错,你会发现结果只有数组最后一个输出才正确,前面n-1个都是随机数,而之前n-1次分配的空间由于没有记录地址,都丢失了,只有程序结束后才会被系统回收。
提醒一下,自己动态分配的空间要自己释放(free)。
提醒一下,自己动态分配的空间要自己释放(free)。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般来说,内存需要用多少,就开辟多少,如果你非要用循环的方式不断的增加内存大小,建议你用以下方法:
关键是用到函数realloc,这个函数的作用,网上很多,可以去查查。主要是用来在原有内存空间的基础上,增加内存空间大小的。
#include<stdio.h>
#include<stdlib.h>
void main()
{
int i,n,*a;
scanf("%d",&n);
for(i=0;i<n;i++)
{
if (0==i)
a = (int*)malloc(sizeof(int));// 第一次进来时,开辟4字节大小的内存
else
realloc(a, sizeof(int)*(i+1));// 以后每次进来都增开4字节大小的内存
a[i]=i;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
关键是用到函数realloc,这个函数的作用,网上很多,可以去查查。主要是用来在原有内存空间的基础上,增加内存空间大小的。
#include<stdio.h>
#include<stdlib.h>
void main()
{
int i,n,*a;
scanf("%d",&n);
for(i=0;i<n;i++)
{
if (0==i)
a = (int*)malloc(sizeof(int));// 第一次进来时,开辟4字节大小的内存
else
realloc(a, sizeof(int)*(i+1));// 以后每次进来都增开4字节大小的内存
a[i]=i;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
malloc()的参数是长度
如果你直接输入a=(int *)malloc(n*4);也是正确的
关键在于你前一种方法开辟了n个4,也就是n个整型变量所需要的空间
而后一种只开了一个4,如果你存进数组的整型变量超过1个,那么便会超出开辟的空间的范围
从而发生错误,动态开辟内存就是需要多少开多少,少了也是不行的。
补充一下:sizeof(int)得到的是int的大小,也就是4个字节。
如果你直接输入a=(int *)malloc(n*4);也是正确的
关键在于你前一种方法开辟了n个4,也就是n个整型变量所需要的空间
而后一种只开了一个4,如果你存进数组的整型变量超过1个,那么便会超出开辟的空间的范围
从而发生错误,动态开辟内存就是需要多少开多少,少了也是不行的。
补充一下:sizeof(int)得到的是int的大小,也就是4个字节。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议你试试:
a+i=(int *)malloc(sizeof(int)); //这种方法错误
a[i]=i;
上面的 方法我自己试了 一下,不好使!
发现:多个malloc生成的内存块是不一定连续的,因此,不能当做数组对待,
因为数组最大的特点是:可以用a+i表示第i个元素,而你这种方法分配的内存有可能不是不连续的
a+i=(int *)malloc(sizeof(int)); //这种方法错误
a[i]=i;
上面的 方法我自己试了 一下,不好使!
发现:多个malloc生成的内存块是不一定连续的,因此,不能当做数组对待,
因为数组最大的特点是:可以用a+i表示第i个元素,而你这种方法分配的内存有可能不是不连续的
追问
那用为什么叫动态申请内存,这一点都不动态,使用前必须分配好,徒有其名啊。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询