回 帖 发 新 帖 刷新版面

主题:C语言   malloc 函数

我的追问   2011-03-01 19:07 #include<stdio.h>
#include<stdlib.h>
int main()
{
 int *p ,*q ;
 int i      ;
 q=p=(int *)malloc(3) ;
 for(i=0;i<3;i++)
 {
 scanf("%d",p++);
 }
 for(i=0;i<3;q++,i++)
 {
  printf("%d\n",*q);
  
 }
 free(p);
 free(q);
}


 

我这个哪错啊?



=p=(int *)malloc(3) ;不能写成这样?


为啥只能写成这样啊
q = p = (int *)malloc(3*sizeof(int));


谢谢

回复列表 (共4个回复)

沙发

malloc(3)
表示分配3个字节的内存空间。通常,这不足以容纳三个int。(一个int要占据sizeof(int)这么多个字节。sizeof(int)的值一般是4或者2)

malloc(3*sizeof(int))就可以了。
当然也可以先写size_t n = 3 * sizeof(int);
然后malloc(n)

板凳


可我把3改为12后 还是有错啊

3 楼


这段代码还是有些错误的/
输入时你的指针移动,可是你在输出时已经找不到初始地址了,而是从空间的尾部开始的。
因此,输入形式可为
for(i=0;i<3;i++)
{
  scanf("%d",&p[i]);
}
输出最好也别这样,因为下次如果还要用这段空间,你又找不到头部地址了.
很显然,由于这个原因,free()时也会产生错误。

另:二楼指出的问题也请lz注意、

4 楼

楼主的代码除了上面的错误,还有两处。
1。动态申请的空间,只能释放一次,也就是说malloc和calloc的个数要等于free的2。从哪里申请的空间就必须从哪里释放。如果申请8k的空间,实际申请的比这要多,比如10k。开头的2k存放的是一些用于free的信息,这些对于写代码的人来说是隐藏的。而真正返回地址是从第2k开始的地址。楼主的代码的指针都移动了,因此不能正确释放。

我来回复

您尚未登录,请登录后再回复。点此登录或注册