套路还在——MOOC视频的指针

入职前就给安排了MOOC视频,其中看到了关于指针的几段。

struct aa{
    int tmp;
};

struct aa* fun(aa* t)
{
    struct aa tt = {100};
    t = &tt;
    return t;
}

int main(int argc, char *argv[])
{
    struct aa *bb=new struct aa;

    aa* i=fun(bb);

    return 0;
}

main执行后,bb的tmp值是随机的,而i的tmp值是100.

原因,bb作为指针传入,在函数fun内将tt的地址传给b,函数返回后,参数出栈,指针指向无变化。但是return相当于内存复制,把栈中tt的地址复制给了i。

所以i的其实就是栈中的tt。

以前从未想过如此return返回指针,不过发现倒也能用。最后仔细一想,实在太不安全。看下面的例子:

struct aa* fun(aa** t)
{
    struct aa tt = {100};
    *t = &tt;
    tt.tmp = 10;
    return *t;
}

int main(int argc, char *argv[])
{
    struct aa *bb=new struct aa;

    aa* i=fun(&bb);

    return 0;
}

这个就很能说明问题了!

首先(1):这样修改可以使得bb的值有意义。

bb本是指针,将二级指针传入。再把tt的指针赋给参数(二级指针)的一级指针。待函数返回时,二级指针确实没有变化,不过二级指针的一级指针的指向发生在函数

内部发生变化,这是可以的。所以bb的值有变化。

不过重要的是(2):并不是100.

这就是说在函数内部分配的的结构体tt。当我指针赋值后,如果修改了tt的tmp值,那么返回后的i和bb的tmp都发生了改变。

不过,我也有一些不明白。tt是局部变量,应该在栈中,函数结束后难道不是应该出栈吗?为什么还是有值?指针指向它为什么没有问题?

刚刚查了资料,补充一下。是因为堆栈空间没有销毁。所以如果我动态申请很多空间,则那个值就不一定了。

int main(int argc, char *argv[])
{
    struct aa *bb = new struct aa;

    aa* i = fun(&bb);
    int *nn = new int[1024 * 1024];

    return 0;
}

就是在fun函数后面分派一个很大的动态空间,再看i和bb都变了。

时间: 2024-08-25 08:42:35

套路还在——MOOC视频的指针的相关文章

程序猿之---C语言细节27(函数无参数时细节、函数默认返回int型证明、return默认还回值、void指针++操作)

主要内容:函数无参数时细节.函数默认返回int型证明.return默认还回值.void指针++操作 一.函数无参数时细节 函数无参数时应该加上void 在c语言中一个函数 void f(); 在使用时传递参数f(2);没有报错,而在c++中则会报错 最好加上void来明确函数是无参数的 二.函数默认返回类型为int型 见下面程序 三.return默认返回1 细节:return不可返回执行栈内存中的指针,因为该内存在函数体结束时自动销毁 四.void 指针++操作 void *p; p++; //

传智播客视频学习 ---->>>> 指针 int *p, p是什么,&p是什么,*p是什么

int *p = NULL; p:指针p所指向的内存的地址 *p:指针p所指向的内存地址的值 &p:指针p的地址 1 #ifndef _CODE_POINTER_DEMO01_H_ 2 #define _CODE_POINTER_DEMO01_H_ 3 4 #include <stdlib.h> 5 #include <string.h> 6 #include <stdio.h> 7 8 int main(){ 9 10 int a = 10; 11 12 ch

day03 hadoop的解压与配置文件的配置,还需要看视频

拷贝hadoop1.2.1.tar.gz安装包到其他的节点上 scp -r ~/hadoop-1.2.1.tar.gz  [email protected]:~/ tar -zxvf hadoop-1.2.1.tar.gz  解压tar包 ln -sf /root/hadoop-1.2.1 /home/hadoop-1.2  创建快捷方式 scp ./* [email protected]:/home/hadoop-1.2/conf/   拷贝当前目录下的所有文件到指定的主机的指定目录下 [[e

[OpenCV]2 读写视频

除了读入图片之外,读写视频也足够简单易学,下面来看看如何读写视频吧. 播放硬盘中的视频: #include "highgui.h" int main(int argc,char** argv) { cvNamedWindow("Test2",CV_WINDOW_AUTOSIZE); CvCapture* capture=cvCreateFileCapture(argv[1]); IplImage* frame; while(1) { frame=cvQueryFra

陈松松:2017年最新的视频营销9大操作步骤和实战细节

每个视频,都是你的金牌业务员 这是我写的第34篇视频营销原创文章 与其搜索十年,不如花一年的时间学习,去赚9年的高薪! 视频营销如果你真能坚持下来,越到后期效果越明显,而且长期给我们带来大量精准的流量. 你像我5年前的视频到现在依然给我带来大量的精准客户,而且有些产品已经不销售了,仍然能找到我,并求着我卖给他. 其实视频营销的操作方法非常简单,把每个细节做好,每个环节优化好,持续的做下去,再选择几款利润在300元以上正规的产品,前期积累几个月,或者先做个几年,积累到一定程度,到后期你完全不用再操

Direcshow中视频捕捉和参数设置报告

Direcshow中视频捕捉和参数设置报告 1.      关于视频捕捉(About Video Capture in Dshow) 1视频捕捉Graph的构建 一个能够捕捉音频或者视频的graph图都称之为捕捉graph图.捕捉graph图比一般的文件回放graph图要复杂许多,dshow提供了一个Capture Graph Builder COM组件使得捕捉graph图的生成更加简单.Capture Graph Builder提供了一个ICaptureGraphBuilder2接口,这个接口

视频捕获

目 录 一. 视频捕获快速入门 2 二.基本的捕获设置 3 1.设置捕获速度: 3 2.设置终止捕获 4 3.捕获的时间限制 4 三.关于捕获窗口 4 1.创建一个AVICAP捕获窗口 5 2.将一个捕获窗口连接至捕获设备 5 3. 父窗口与子窗口的交互 5 4.捕获窗口的状态 6 四.视频捕获驱动和音频驱动 6 1.视频捕获驱动的性能: 6 2.视频对话框: 6 3.PREVIEW 和 OVERLAY模式: 7 4.视频格式 7 5.视频捕获设置 7 6.声频格式 8 五.使用视频捕获 8 1

MOOC学习成果认证及对高等教育变革路径的影响

MOOC是网络开放教育创新发展的产物,也是备受人们欢迎的网络学习途径.当前制约MOOC能否可持续深入发展的问题聚焦于MOOC学习成果能否得到合理的认证.MOOC学习成果认证分为非学分认证和学分认证.MOOC非学分认证包括课程证书认证.项目证书认证和学习者自我认证,由于其未触及大学教学制度的内核——学分,因而遭致不少非议:而MOOC学分认证由于受到教学测评.学习者身份识别.大学文化传统和学分管理制度等多种因素的限制,运作起来也并不顺畅.MOOC的发展使大学具有越来越鲜明的虚拟结构特性,但不会出现将

【OpenCV归纳】2 读写视频

 除了读入图片之外,读写视频也足够简单易学,下面来看看如何读写视频吧. 播放硬盘中的视频: #include "highgui.h" int main(int argc,char** argv) { cvNamedWindow("Test2",CV_WINDOW_AUTOSIZE); CvCapture* capture=cvCreateFileCapture(argv[1]); IplImage* frame; while(1) { frame=cvQuery