鱼C论坛

 找回密码
 立即注册
查看: 1900|回复: 13

[已解决]新手问题 求解!!

[复制链接]
发表于 2017-12-26 17:55:17 | 显示全部楼层 |阅读模式

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

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

x
听了小甲鱼的课之后头铁了一波  试了一次到底是不直接释放
于是便写了一下代码(错的)
#include"stdio.h"

int* m(int,int);

int* m(int x,int y)
{
        char str[]="sad";
        
        return str;
        
}

int main()
{
        int x=120,y=110;
        
        printf("%s",m(x,y));
        
        return 0;
}


发现的确释放了  输出的是空白
但是真的释放了吗?
#include"stdio.h"

int* m(int,int);

int* m(int x,int y)
{
        char str[]="sad";
        
        return str;
        
}

int main()
{
        int x=120,y=110;
        
        printf("%c",*m(x,y));
        
        return 0;
}

于是我把代码微改一波(错的)
发现可以输出's'


既然释放了那么应该也是空的呀   求解!!
最佳答案
2017-12-26 20:29:39
本帖最后由 人造人 于 2017-12-26 20:31 编辑
  1. #include"stdio.h"

  2. char *GetString(void)
  3. {
  4.         char str[] = "hello world!";

  5.         return str;

  6. }

  7. int main(void)
  8. {
  9.         char *str = GetString();
  10.        
  11.         printf("%c\n", *str++);
  12.         printf("%c\n", *str++);
  13.         printf("%c\n", *str++);
  14.         printf("%c\n", *str++);
  15.         printf("%c\n", *str++);

  16.         return 0;
  17. }
复制代码


无标题.png
GetString函数成功返回了字符串

无标题1.png
无标题2.png
字符h已经保存下来了
字符串hello world还没有被覆盖

无标题3.png
进入printf内部
字符h在rdx寄存器中保存,字符串还没有被覆盖

无标题4.png
字符串已经被覆盖
字符h还在rdx寄存器中保存着

无标题5.png
字符h成功输出
字符串hello world已经不在

无标题6.png
字符串hello world已经不在
rax寄存器保存的不是字符e,也就是说无法输出字符e

无标题7.png
无法输出字符e

无标题8.png
字符串hello world已经不在
其他字符也无法输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-12-26 18:05:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-26 18:19:27 From FishC Mobile | 显示全部楼层
返回的是一个字符指针,你用%c相当于取第一个字符
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-26 18:41:18 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-26 18:19
返回的是一个字符指针,你用%c相当于取第一个字符

我那个是局部变量呀!  用了之后不是应该被释放么?  这也就是第一个程序输不出的原因  但是第二个我取一个字符却输出来了   既然这样那第一个应该也输得出才对呀!  我一直想不通这个      
  

既然您说是字符指针  那么%s应该也输得出呀!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-26 20:02:24 From FishC Mobile | 显示全部楼层
本帖最后由 BngThea 于 2017-12-26 20:04 编辑
a1296715528 发表于 2017-12-26 18:41
我那个是局部变量呀!  用了之后不是应该被释放么?  这也就是第一个程序输不出的原因  但是第二个我取一 ...


指针就不管局不局部

%s只能用char*进行输出,前面说错了,返回的是int*
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-26 20:29:39 | 显示全部楼层    本楼为最佳答案   
本帖最后由 人造人 于 2017-12-26 20:31 编辑
  1. #include"stdio.h"

  2. char *GetString(void)
  3. {
  4.         char str[] = "hello world!";

  5.         return str;

  6. }

  7. int main(void)
  8. {
  9.         char *str = GetString();
  10.        
  11.         printf("%c\n", *str++);
  12.         printf("%c\n", *str++);
  13.         printf("%c\n", *str++);
  14.         printf("%c\n", *str++);
  15.         printf("%c\n", *str++);

  16.         return 0;
  17. }
复制代码


无标题.png
GetString函数成功返回了字符串

无标题1.png
无标题2.png
字符h已经保存下来了
字符串hello world还没有被覆盖

无标题3.png
进入printf内部
字符h在rdx寄存器中保存,字符串还没有被覆盖

无标题4.png
字符串已经被覆盖
字符h还在rdx寄存器中保存着

无标题5.png
字符h成功输出
字符串hello world已经不在

无标题6.png
字符串hello world已经不在
rax寄存器保存的不是字符e,也就是说无法输出字符e

无标题7.png
无法输出字符e

无标题8.png
字符串hello world已经不在
其他字符也无法输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-27 00:16:01 From FishC Mobile | 显示全部楼层
BngThea 发表于 2017-12-26 20:02
指针就不管局不局部

%s只能用char*进行输出,前面说错了,返回的是int*

我搞错了  不好意思     
之后我像您说的那样改成了char*  还是输不出%s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-27 00:31:52 From FishC Mobile | 显示全部楼层
人造人 发表于 2017-12-26 20:29
GetString函数成功返回了字符串



仔细看了看   意思就是说一开始字符串还没有被抹掉,要输出的字符会存到另外一个地方去,然后在第一个printf输出之前,字符串会被抹掉。对吧?    那输出字符串实际上是一个一个字符输出,一直到最后的'\0'  这个岂不是也可以输出一个字符出来?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-27 01:14:18 | 显示全部楼层
a1296715528 发表于 2017-12-27 00:31
仔细看了看   意思就是说一开始字符串还没有被抹掉,要输出的字符会存到另外一个地方去,然后在第一个pri ...


我不知道怎么解释才能让你明白,你学过汇编语言吗?
总之你的想法是错误的

无标题.png
rdx中保存的是字符串吗?很显然不是,rdx中保存的是一个地址,这个地址存放字符串


无标题1.png
然后,字符串被覆盖,无法输出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-27 10:24:19 From FishC Mobile | 显示全部楼层
没学过 我大一  刚接触编程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-27 10:34:19 From FishC Mobile | 显示全部楼层
人造人 发表于 2017-12-27 01:14
我不知道怎么解释才能让你明白,你学过汇编语言吗?
总之你的想法是错误的


那个覆盖在return0之后呀,,  不是应该可以输出么?╭(°A°`)╮ 。。。。



总之还是谢谢你了!   寒假我去看看汇编语言再来看吧!   你这个编程软件是什么呀!  super高级诶    可否分享一下( . )
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-27 14:34:10 | 显示全部楼层
a1296715528 发表于 2017-12-27 10:34
那个覆盖在return0之后呀,,  不是应该可以输出么?╭(°A°`)╮ 。。。。

覆盖不在return 之后
我用 Visual Studio 2017
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-27 16:06:39 From FishC Mobile | 显示全部楼层
好的  谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-12-27 16:06:48 From FishC Mobile | 显示全部楼层
人造人 发表于 2017-12-27 14:34
覆盖不在return 之后
我用 Visual Studio 2017

好的!谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 07:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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