a1296715528 发表于 2017-12-26 17:55:17

新手问题 求解!!

听了小甲鱼的课之后头铁了一波试了一次到底是不直接释放
于是便写了一下代码(错的)
#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'


既然释放了那么应该也是空的呀   求解!!

ba21 发表于 2017-12-26 18:05:45

http://bbs.fishc.com/thread-102087-1-1.html

BngThea 发表于 2017-12-26 18:19:27

返回的是一个字符指针,你用%c相当于取第一个字符

a1296715528 发表于 2017-12-26 18:41:18

BngThea 发表于 2017-12-26 18:19
返回的是一个字符指针,你用%c相当于取第一个字符

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


既然您说是字符指针那么%s应该也输得出呀!

BngThea 发表于 2017-12-26 20:02:24

本帖最后由 BngThea 于 2017-12-26 20:04 编辑

a1296715528 发表于 2017-12-26 18:41
我那个是局部变量呀!用了之后不是应该被释放么?这也就是第一个程序输不出的原因但是第二个我取一 ...

指针就不管局不局部

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

人造人 发表于 2017-12-26 20:29:39

本帖最后由 人造人 于 2017-12-26 20:31 编辑

#include"stdio.h"

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

        return str;

}

int main(void)
{
        char *str = GetString();
       
        printf("%c\n", *str++);
        printf("%c\n", *str++);
        printf("%c\n", *str++);
        printf("%c\n", *str++);
        printf("%c\n", *str++);

        return 0;
}



GetString函数成功返回了字符串



字符h已经保存下来了
字符串hello world还没有被覆盖


进入printf内部
字符h在rdx寄存器中保存,字符串还没有被覆盖


字符串已经被覆盖
字符h还在rdx寄存器中保存着


字符h成功输出
字符串hello world已经不在


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


无法输出字符e


字符串hello world已经不在
其他字符也无法输出

a1296715528 发表于 2017-12-27 00:16:01

BngThea 发表于 2017-12-26 20:02
指针就不管局不局部

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

我搞错了不好意思   
之后我像您说的那样改成了char*还是输不出%s

a1296715528 发表于 2017-12-27 00:31:52

人造人 发表于 2017-12-26 20:29
GetString函数成功返回了字符串




仔细看了看   意思就是说一开始字符串还没有被抹掉,要输出的字符会存到另外一个地方去,然后在第一个printf输出之前,字符串会被抹掉。对吧?    那输出字符串实际上是一个一个字符输出,一直到最后的'\0'这个岂不是也可以输出一个字符出来?

人造人 发表于 2017-12-27 01:14:18

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

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


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



然后,字符串被覆盖,无法输出

a1296715528 发表于 2017-12-27 10:24:19

没学过 我大一刚接触编程

a1296715528 发表于 2017-12-27 10:34:19

人造人 发表于 2017-12-27 01:14
我不知道怎么解释才能让你明白,你学过汇编语言吗?
总之你的想法是错误的



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



总之还是谢谢你了!   寒假我去看看汇编语言再来看吧!   你这个编程软件是什么呀!super高级诶    可否分享一下( . )

人造人 发表于 2017-12-27 14:34:10

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




覆盖不在return 之后
我用 Visual Studio 2017

a1296715528 发表于 2017-12-27 16:06:39

好的谢谢!

a1296715528 发表于 2017-12-27 16:06:48

人造人 发表于 2017-12-27 14:34
覆盖不在return 之后
我用 Visual Studio 2017

好的!谢谢
页: [1]
查看完整版本: 新手问题 求解!!