鱼C论坛

 找回密码
 立即注册
查看: 2237|回复: 4

[已解决]问题求助

[复制链接]
发表于 2022-10-4 14:57:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一道选择题
  1. #include<stdio.h>
  2. #include<string.h>
  3. void fun(char *s)
  4. {
  5.     char a[7];
  6.     s=a;
  7.     strcpy(a,"look");
  8. }
  9. int main()
  10. {
  11.    char *p=NULL;
  12.    fun(p);
  13.    puts(p);
  14.     return (0);
  15. }
复制代码

程序运行结果为什么选不确定的值
最佳答案
2022-10-4 15:29:24
本帖最后由 jackz007 于 2022-10-4 15:43 编辑
  1. #include<stdio.h>
  2. #include<string.h>

  3. void fun(char * s)
  4. {
  5.         char a[7]          ;
  6.         s = a              ;
  7.         strcpy(a , "look") ;
  8. }

  9. int main(void)
  10. {
  11.        char * p = NULL     ;
  12.        fun(p)              ;  // p = NULL,虽然作为参数被传入 fun(),但在 fun() 中被修改的只是 p 的副本
  13.        puts(p)             ;  // fun(p) 并不能改变 p ,所以,p 仍然是 NULL,执行此句程序会直接奔溃。
  14. }
复制代码

        楼主可以实际编译、运行一下这个程序
        下面的代码才可以实现楼主所说的效果
  1. #include<stdio.h>
  2. #include<string.h>

  3. void fun(char ** s)
  4. {
  5.         static char a[7]   ; // a[] 必须定义为静态变量,否则,在函数 fun() 调用结束后,其所占内存会被即刻释放,无法看到效果。
  6.         * s = a            ;
  7.         strcpy(a , "look") ;
  8. }

  9. int main(void)
  10. {
  11.        char * p = NULL     ;
  12.        fun(& p)            ; // 传入 fun() 的是指向 p 的指针,这样,fun() 对 p 的修改才可以得到保留
  13.        puts(p)             ;
  14. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-10-4 15:08:07 | 显示全部楼层
本帖最后由 临时号 于 2022-10-4 15:14 编辑

在main函数中,你将p传入fun函数中,在fun函数中,你让s也就是main函数中的p指向a
但a并没有提前初始化,那里面有什么垃圾就给你什么垃圾,所以当然不确定啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-4 15:24:06 | 显示全部楼层
临时号 发表于 2022-10-4 15:08
在main函数中,你将p传入fun函数中,在fun函数中,你让s也就是main函数中的p指向a
但a并没有提前初始化,那里 ...

a不是被赋值为look了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 15:29:24 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-10-4 15:43 编辑
  1. #include<stdio.h>
  2. #include<string.h>

  3. void fun(char * s)
  4. {
  5.         char a[7]          ;
  6.         s = a              ;
  7.         strcpy(a , "look") ;
  8. }

  9. int main(void)
  10. {
  11.        char * p = NULL     ;
  12.        fun(p)              ;  // p = NULL,虽然作为参数被传入 fun(),但在 fun() 中被修改的只是 p 的副本
  13.        puts(p)             ;  // fun(p) 并不能改变 p ,所以,p 仍然是 NULL,执行此句程序会直接奔溃。
  14. }
复制代码

        楼主可以实际编译、运行一下这个程序
        下面的代码才可以实现楼主所说的效果
  1. #include<stdio.h>
  2. #include<string.h>

  3. void fun(char ** s)
  4. {
  5.         static char a[7]   ; // a[] 必须定义为静态变量,否则,在函数 fun() 调用结束后,其所占内存会被即刻释放,无法看到效果。
  6.         * s = a            ;
  7.         strcpy(a , "look") ;
  8. }

  9. int main(void)
  10. {
  11.        char * p = NULL     ;
  12.        fun(& p)            ; // 传入 fun() 的是指向 p 的指针,这样,fun() 对 p 的修改才可以得到保留
  13.        puts(p)             ;
  14. }
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-4 15:34:13 | 显示全部楼层
h-b-z-d-j-s-m 发表于 2022-10-4 15:24
a不是被赋值为look了吗

先执行s=a,然后再赋值为look
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表