c语言编程程序崩溃

c语言编程程序崩溃,第1张

同学,你是对c语言的按值传递理解不到位。

void s ( int * p_c )

{

p_contemp = ( int * ) malloc ( 5 * sizeof ( int ) )

此处为for循环控制语句依次给数组依次输入5个数

}

你最初的代码,s ( int * p_c )中,你用malloc 分配了5个int的空间,把此空间的地址赋给了p_contemp,而没有赋给指针p_c,所以p_c指向空,在main()中调用a . h_p

会出错,其为空逗闹指针。

而且就算你在s ( int * p_c )中,把malloc 分配的5个int的空间的地址赋给s的参数p_c指针,在main()中,调用a . h_p ,仍然会出错,a . h_p 仍然为空指针。

因为在c语言中函数的参数是按值传递的,即在本题中,你把a . h_p 作为实参传递给s ( int * p_c )函数,此时a.h_p为空指针,根据按值传递规则,形参p_c将与实a.h_p具有相同的值:轿指庆空。

在s ( int * p_c )内,( int * ) malloc ( 5 * sizeof ( int ) )执行后,把分配到的空间地址赋给形参p_c,此时形参p_c不为空了,但是根据按值传递原则,实参所指向的地址没变闭握,仍为空。

你所谓的“指针传递只要改一个,另一个的内容应该也做了改动”是对的,但是你的代码写的不对。你可以在函数外面弄一个指向某个地址的指针,把它传给一个参数为指针的函数,在函数内修改指针指向的内容,则在函数外实参指针指向的内容也会变。

你也可以考虑用c++的引用传递,即把你最初的s ( int * p_c )声明为s ( int * &p_c ),其它代码不变,就能看到你想要的效果。

这种情况叫做 runtime error (运行时错误)。

在 Windows 碧昌7 上这样提示:

在 Windows XP 上这样提示:

runtime  error (运行时错误)就是程序运行到一半,程序就崩溃了。

比如说:

①除以零

②数组越界:int a[3] a[10000000]=10

③指针越兆搭界:int * p p=(int *)malloc(5 * sizeof(int)) *(p+1000000)=10

④使用已经释放的空间:int * p p=(int *)malloc(5 * sizeof(int))free(p) *p=10

⑤数组开得太大,超悔猜扒出了栈的范围,造成栈溢出:int a[100000000]

楼上回答的都不完整,这也可以是推荐答案,唉。。

程序崩溃的原因有两个:

一是析构函数里name指针的释激做放不正确,new[] 对应的释放方式是: delete []

所以析构函数应该这样定义:

~Person{}

{

delete [] name

}

二是因为你没有定义类的复制构造函数和赋值 *** 作符,使得编译器使用默认的复制构造函数和赋值 *** 作符

Person a("张小松",21),b=a,c

c=b

b = a 是要使用复制构造函数的,默认的复制构造函数使得b的name成员指向a对象的指针地址

c = b 调用了默认赋值 *** 作符,使得c的name成员指向b对象的指针地址

由上可知:你的程序使得a,b,c对象的name成员指向同一个内存,这样程序在结束的时候释放各个对象,对同一个内存地址释放了3次,肯定会崩溃

你必须再定义一个复制构造函数和赋值 *** 作符,使用深度复制,使得各个对象name成员指向自己独有的内存地址,定义如下:

Person(const Person &p) //复制构造函数

{

name = new char[strlen(p.name) + 1]

strcpy(name, p.name)

age = p.age

}

Person&operator=(const Person&p) //赋值 *** 作符

{

if (this == &p)//避免自圆悉己给自己赋值

{

return *this

}

delete [] name//先释放左边对象的内存空间

name = new char[strlen(p.name) + 1]

strcpy(name, p.name)

age = p.age

return *this

}

另外,这样以后程序还是会崩溃,原因是因为main函数中定义的c对象,是调用一个未给name分配内存空间的构造函数,即 :

Person(){}

这样,你在将b赋值给c时,(c = b),调用赋值 *** 作符,先执行了释放c内存的 *** 作,未分配就释放,肯定出错,解决办法是将构造函数统一分配内存,修改如下:

Person()

{

name = new char[1]

name[0] = '\0'

}

或者修改如下:

Person()

{

name = NULL

}

这样,整个程序如下:

#include<iostream>

#include<string>

using namespace std

class Person

{

char *name

int age

public:

Person(){name = NULL}

Person(char *n,int a)

{

name=new char[strlen(n)+1]

strcpy(name,n)

age=a

}

Person(const Person&p)

{

name = new char[strlen(p.name) + 1]

strcpy(name, p.name)

age = p.age

}

Person&operator=(const Person&p)

{

if (this == &p)

{

return *this

}

delete [] name

name = new char[strlen(p.name) + 1]

strcpy(name, p.name)

age = p.age

return *this

}

~Person()

{

delete [] name

}

void print()

{

cout<<name<<'\t'<<age<<endl

}

}

void main()

{

Person a("张小松"明腔衡,21), b = a, c

c = b

c.print()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12400913.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存