关于指针变量,以及指针变量作为函数参数的题目分析

来源:互联网 发布:阿里云干什么的 编辑:程序博客网 时间:2024/05/20 16:32

C语言中指针地址猜想

现在有如下一个题目:

下面是用C语言书写的函数get_str 的两种定义方式以及两种调用方式。定义方式1 void get_str(char* p){p = (char *) malloc(1+sizeof("testing"));strcpy(p, "testing");} 定义方式2void 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】若分别采用函数定义方式12 和调用方式12,请分析程序的运行情况,填充下面的空(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”。
这就是本题的关于指针和函数传递调用的分析。

有什么出入的地方欢迎大家指出。

1 0