C语言入门,为什么函数内用malloc会被释放?如图,我打印的时候就报错了

如题所述

首先,你用creat(a)调用时,计算机会将存放在a中的数值0取出当成参数进行调用,这个明显不是你的意图。

你的目的是告诉creat函数变量a的地址,然后让函数申请数组后,将首地址放到变量a中去,所以应当在调用的时候给变量a的地址,写成creat(&a);这样才能改变a的内容。

试着修改一下程序:

void creat(int **a)
{
    (*a)=(int *)malloc(sizeof(int)*10);
    (*a)[5]=666;
}
void print(int *a)
{
    printf("test%d",a[5]);
}
void main()
{
    int *a=0;
    creat(&a);
    printf("main:%d\n",a[5]);
    print(a);
    if ( a ) free(a);
 
  system("pause");
}

追问

你意思是计算机不能识别 *a到底是指针还是一个值?然后默认当作值用?

追答

所谓值,所谓指针对于计算机来说都是数据,就看你如何说明它的类型
你声明int *a,那么这个a就是一个指针变量,这个指针变量在函数调用时被函数临时申请,并存放你传入的值。
那么你传入的是什么要看调用语句,creat(a)的意思就是取出变量a中存放的数据调用函数,函数申请自己的一个变量a来存放这个值,这个值函数调用完成后就被丢弃了,并不会影响到a的取值,变量a没有机会被creat函数修改,creat操作的始终是a中存放的数据的副本而已。
creat(a);好比告诉creat函数:我有个值0,你处理吧,函数申请了个变量a存放这个0,然后又修改a的值,最后返回时这个a被放弃了,修改的值也就丢失了,主程序不可能知道子程序自己申请的变量的值有什么变化,也不会用这个改变来赋值给自己的变量a
creat(&a);告诉creat函数:我有个单元,你可以改变这个单元存储的数据,这个单元的地址告诉你,(现在这个单元存放了0),函数申请变量a存放这个地址,然后函数申请内存后,将指针放到a中地址指向的这个单元中去,a变量最后被放弃了,放弃的只是主程序a的地址的副本。

追问

那malloc函数为一个指针申请内存,必须得用到接受内存的指针变量的地址是吗?

追答

申请到了内存后,获得一个首地址,这个地址如何保存就是程序设计的事了
在你的程序中,你将它保存到子程序开设的临时参数变量a中,由于这个变量(实际上你可以任意指定它的名字,与主程序中变量没关系)在子程序执行完毕后就被放弃了,所以你申请的那块内存的地址也一并被放弃,主程序拿不到,这是关键问题。
要想主程序拿到这个地址,一是提供一个容器(变量,给出地址),让子程序将那个地址放进去;另一个可以利用返回值将地址直接返回,然后让主程序来保存,就像楼上那位说的那样。
我修改的程序是属于第1种解决方法,第2种也比较常见,比如malloc就是这类返回值的函数。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-11-20
  想法不错,单独的函数分配内存
  不过有两个问题你要注意
  1 没有free
  2 参数可以传入,如果不是引用,是不会传出值的
  根据2 printf 中的a[5]中的a还是等于0,你可以用%p 打印输出看看
  两个解决办法:
  1 是将creat改为 int* creat();
  然后这样用 a=creat();
  2 是使用引用调用 void creat(int*&a);
第2个回答  2015-11-20
你把变量a变成全局的就可以了.
第3个回答  2015-11-20
create(int &a)
相似回答
大家正在搜