关于指针变量,以及指针变量作为函数参数的题目分析
来源:互联网 发布:阿里云干什么的 编辑:程序博客网 时间:2024/05/20 16:32
C语言中指针地址猜想
现在有如下一个题目:
下面是用C语言书写的函数get_str 的两种定义方式以及两种调用方式。定义方式1 void get_str(char* p){p = (char *) malloc(1+sizeof("testing"));strcpy(p, "testing");} 定义方式2:void get_str(char** p){*p =(char *) malloc(1+sizeof("testing"));strcpy(*p, "testing");}调用方式1int main( ){char* ptr = NULL;get_str(ptr);if (ptr)printf("%s\n", ptr);elseprintf("%p\n", ptr); /* 输出指针的值*/return 0;}调用方式2 int main( ){char* ptr = NULL;get_str(&ptr);if (ptr)printf("%s\n", ptr);elseprintf("%p\n", ptr);return 0;}【问题2】若分别采用函数定义方式1、2 和调用方式1、2,请分析程序的运行情况,填充下面的空(1)~(3)。若采用定义方式1 和调用方式1,则输出为“00000000”。若采用定义方式1 和调用方式2,则(1) 若采用定义方式2 和调用方式1,则(2) 若采用定义方式2 和调用方式2,则(3)
根据如上内容我们一一讨论,仅供个人理解若有不对希望大家评论出来谢谢。
若采用定义方式1和调用方式1:
可以看到调用方式1:首先采用的是char *ptr=NULL;
那么也就是给ptr的地址赋上空值也就是0 ,然后调用:get_str(ptr);
则将ptr的地址传到定义方式1中去,p = (char *) malloc(1+sizeof("testing"));
但是定义方式又把p开辟了一个新的空间,但其实ptr里面的地址还是没有改变而p在函数内申请的内存未传出函数,造成了内存泄漏。可以理解为局部变量。因此输出的结果是空即“00000000”。
若采用定义方式2和调用方式1:
由于需要传给get_str(char **p)
参数p指向的是指针的指针,因此必须输入参数的时候应该为指针的地址而不是ptr所表示的地址,应该写成&ptr,这样才对,因此采用这种方式输出不了任何数据会显示运行异常。
若采用定义方式2和调用方式2:
上面已经分析过了,通过get_str(char **p)
传入&ptr,然后代码下一步执行p=(char )malloc(1+sizeof(“testing”);此步骤则是进行对指向&ptr的p进行 *p指向ptr的空间申请,同时ptr指针变量空间发生改变为通过malloc函数申请到的存储区首地址,因为是对ptr申请空间因此函数结束后传给主函数的则是改变后的值。
若采用定义方式1和调用方式2:
通过函数传给get_str(char *p)
的是&ptr,然后p存的是指针变量ptr的地址,并没有指向ptr,因此再次对p申请空间的时候依然只是改变p通过malloc函数申请到的存储区首地址,也就是从&ptr变为存有通过malloc函数申请到的存储区的首地址,因此下面的步骤改变的仅仅是*p所指向的内容,这也就是单向传值,所以主函数的输出依旧没变还是输出”00000000”。
这就是本题的关于指针和函数传递调用的分析。
有什么出入的地方欢迎大家指出。
- 关于指针变量,以及指针变量作为函数参数的题目分析
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 指针变量作为函数参数
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析 .
- 结构体变量、结构指针变量、结构数组作为函数的参数应用实例分析
- C语言中指针变量作为函数参数和一般变量作为函数参数的区别
- C语言指针变量作为函数参数
- 结构体变量指针作为函数参数
- C语言指针变量作为函数参数
- C语言指针变量作为函数参数
- 指针变量作为函数参数(1)
- hbase启动
- 字符串和字符
- oracle ORA-00119和ORA-00132的解决方案
- css在ios和android设备上的兼容性问题(移动设备不同内核浏览器样式兼容性)笔记
- oltu 实现oauth协议
- 关于指针变量,以及指针变量作为函数参数的题目分析
- 如何关闭 Android Studio 新特性Instant Run
- 安裝SQL2012 出現規則"Microsoft .NET應用程式安全性"產生警告
- route命令
- c# 委托 和 事件 的区别
- cmd使用mysql客户端
- 关于datagrid合并单元格的问题
- iOS6、7、8、9、10主要新特性和注意点
- java实现二维码-使用QR Code方式生成和解析二维码