关于c++指针的问题 想问问指针作为函数参数 与作为 返回值时到底是怎么传递的?

[复制链接]
查看11 | 回复5 | 2021-1-27 06:52:09 | 显示全部楼层 |阅读模式
classc
{
public:
int*p;

};
voidf(c&x,int*t){
x.p=newint[10];
t=x.p;//在这一步指针t与指针p等同;操作t等价于操作p;
delete[]x.p;


}
intmain(){

cb;
int*t;
f(b,t);
t=newint[10];
t[1]=10086;
cout
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层

classc
{
public:
int*p;

};
voidf(int*p,int*t=NULL){//但是将函数参数改变之后输出就变成0
p=newint[10];
t=p;
delete[]p;
}
intmain(){
cb;
int*t;
f(b.p,t);
t=newint[10];
t[1]=10086;
cout[usedforc.p],secondblock--->[free]
释放后
c.p==fistblock---->[allfree]
第二次分配
t=fistblock---->[usedfort],secondblock--->[free]
这样c.p==t==fistblock--->都指向为t分配的内存了;
因为函数f的参数c是引用,所以f::c.p=main::c.p
所以函数f调用后,main::c.p指向已经释放的内存,而这块内存,
很大程度上(注意不是必然的),
可能又被分配给t了,
此时自然就有c.p==t了;
c.p[1]根本就是t[1];
只是现在c.p是野指针,c.p[1]根本就是野指针的非法使用,
所以某些时候,运行出错,也是可能的.
所以,这是很大几率的一种巧合,而不是必然
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层

使用std::function是王道。。。
比如
std::functionf=std::bind(::strcpy,_1,_2);
f();

回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层


理解和讨论之前请先学会如何观察!
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
对学习编程者的忠告:

多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程!
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步Debug版对应汇编一行!
单步Debug版对应汇编千行不如单步Release版对应汇编一行!
单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。
VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(TurboC或BorlandC用TurboDebugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层
delete只是告诉操作系统你需要清理内存,但是操作系统清理内存的策略决定了他并不一定马上响应你的请求。楼上说的很清楚了,很多看似无法理解的问题,其实只是巧合,正是这些巧合,让初学者浮想联翩。。。
回复

使用道具 举报

千问 | 2021-1-27 06:52:09 | 显示全部楼层
其实电脑开机后物理内存的每个字节都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行