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]);
}
展开
 我来答
百度网友32cdd9945
2013-03-20 · TA获得超过1374个赞
知道大有可为答主
回答量:2429
采纳率:100%
帮助的人:1902万
展开全部

a=(int *)malloc(sizeof(int));  //这个返回的东西只能放一个 int。 多次malloc 返回的地址是不保证连续的,每次的返回都只能容纳一个int。

a[i]=i;    访问后面的第i个元素,但后面其实是没有东西的,非法访问来的。  如下图,红色的表示没有实际的东西,非法访问


追问
费这么大的劲儿,谢谢你。
fhyangchina
2013-03-20 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:108
采纳率:0%
帮助的人:62.2万
展开全部
只分析错的:编译时不会报错,但是逻辑上有问题,达不到目的,malloc()函数是在堆栈中分配的内存,即使在for循环中你也不能确定它是按顺序给你分配的空间,而且for循环每一次执行的时候,你都给出了a[]数组的首地址,所以只有for循环最后一次分配的才是你得到的最终的a[]的首地址,当然,你分配的空间只能装一个整数,i>0之后就出界了,即使编译器不进行边界检测不报错,你会发现结果只有数组最后一个输出才正确,前面n-1个都是随机数,而之前n-1次分配的空间由于没有记录地址,都丢失了,只有程序结束后才会被系统回收。
提醒一下,自己动态分配的空间要自己释放(free)。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
来自杏花村大气的木星
2013-03-20 · TA获得超过4045个赞
知道小有建树答主
回答量:773
采纳率:33%
帮助的人:986万
展开全部
一般来说,内存需要用多少,就开辟多少,如果你非要用循环的方式不断的增加内存大小,建议你用以下方法:
关键是用到函数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]);
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
眼眶的湿润
2013-03-20 · TA获得超过3279个赞
知道小有建树答主
回答量:806
采纳率:50%
帮助的人:562万
展开全部
malloc()的参数是长度
如果你直接输入a=(int *)malloc(n*4);也是正确的
关键在于你前一种方法开辟了n个4,也就是n个整型变量所需要的空间
而后一种只开了一个4,如果你存进数组的整型变量超过1个,那么便会超出开辟的空间的范围
从而发生错误,动态开辟内存就是需要多少开多少,少了也是不行的。

补充一下:sizeof(int)得到的是int的大小,也就是4个字节。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
lenovo_E520
2013-03-20 · TA获得超过238个赞
知道小有建树答主
回答量:296
采纳率:50%
帮助的人:127万
展开全部
建议你试试:

a+i=(int *)malloc(sizeof(int)); //这种方法错误

a[i]=i;

上面的 方法我自己试了 一下,不好使!

发现:多个malloc生成的内存块是不一定连续的,因此,不能当做数组对待,

因为数组最大的特点是:可以用a+i表示第i个元素,而你这种方法分配的内存有可能不是不连续的
追问
那用为什么叫动态申请内存,这一点都不动态,使用前必须分配好,徒有其名啊。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式