2 shanliyoumin shanliyoumin 于 2017.01.13 17:14 提问

c语言小程序运行内存错误?求大神

#include
#include
void init(int *p);
int main(void)
{
int *a=NULL;
init(a);
printf("%d\n",*a);
return 0;
}
void init(int *p)
{
p=(int *)malloc(sizeof(int));
*p=100;
printf("%d\n",*p);
}
[root@VM_98_146_centos data steucture]# ./a.out
100
Segmentation fault

4个回答

zjn640322
zjn640322   2017.01.14 09:44

int *a = NULL;已经将指针a释放,调用init时相当于init(NULL),并没有在init方法中操作的地址为空,无用,
p = (int *)malloc(sizeof(int))是在给p重分配地址,并不是将p指向该地址,所以存储数据是其实是将指针p地址处的数据改为100,so,全是乱搞
修改:
① *a 不能置为NULL
② p=(int *)malloc(sizeof(int));改为 *p = *((int *)malloc(sizeof(int)))以为将原来a指向((int *)malloc(sizeof(int))),然后去操作a指向的数据

likely_zhao
likely_zhao   2017.01.13 17:59

*p = 100 是把p的地址变成`100 当然就挂了啊

a29562268
a29562268   2017.01.13 18:32

是定义头的问题吗,代码没问题

wf_it_life
wf_it_life   2017.01.16 11:59

楼上正解,p是a的拷贝,p指向a指向的地址,结果你又把p重新分配内存,那么p就指向新的内存,p和a此时已经指向不同的内存了,这时候a仍然是NULL,当然段错误啦。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!