user-0 提问: 关注return 返回值的问题！！求教。跪求，感谢！

回复:
user: user-1
content: %s 就是表示输出指向的字符串，如果你要输出p的地址，用%p

user: user-1
content: 你这里返回是按值返回的，也就是说，在局部变量a析构前，会对a进行复制，函数外接收的实际是一个复制后的值，如果你返回&a，函数外用*a则可能导致出错

user: user-0
content: 引用 16 楼 cfjtaishan 的回复:[quote=引用 15 楼 hu1991514 的回复:] [quote=引用 12 楼 cfjtaishan 的回复:] 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！[/quote] 恩，对。不会清空，不然你平时定义一个变量，若不初始化为什么会是随机值呢。[/quote]  引用 16 楼 cfjtaishan 的回复:[quote=引用 15 楼 hu1991514 的回复:] [quote=引用 12 楼 cfjtaishan 的回复:] 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！[/quote] 恩，对。不会清空，不然你平时定义一个变量，若不初始化为什么会是随机值呢。[/quote]   感谢！！你帮我解答了！很多！！

user: user-2
content: 引用 15 楼 hu1991514 的回复:[quote=引用 12 楼 cfjtaishan 的回复:] 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！[/quote] 恩，对。不会清空，不然你平时定义一个变量，若不初始化为什么会是随机值呢。

user: user-0
content: 引用 12 楼 cfjtaishan 的回复:这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！

user: user-1
content: 引用 4 楼 hu1991514的回复:引用 2楼paschen 的回复:%s 就是表示输出指向的字符串，如果你要输出p的地址，用%p我这里不只要输出地址！第一次字符串被输出时，用的是指针p作为printf函数参数！而打印3，用的是变量a作为printf函数参数！a跟p是两个不同的概念，一个是指针一个是变量名，为什么最后打印出来的都是里面的值 p和a都是变量名，输出的内容取决于你前面的格式，http://en.cppreference.com/w/c/io/fprintf

user: user-1
content: 引用 3 楼 hu1991514的回复:引用 1楼paschen 的回复:你这里返回是按值返回的，也就是说，在局部变量a析构前，会对a进行复制，函数外接收的实际是一个复制后的值，如果你返回&a，函数外用*a则可能导致出错请问下，这里返回值复制到什么地方，因为fun函数栈是先被释放掉的，才在main函数中被变量接受，那被接受之前是在哪里！ 返回值通常是在EAX寄存器

user: user-2
content: 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:[quote=引用 9 楼 hu1991514 的回复:] [quote=引用 8楼自信男孩 的回复:][quote=引用 7 楼 hu1991514 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。   帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?[/quote]bin文件夹里有g++.exe！你值得是这么[/quote] 应该是没有配置环境变量；  http://ask.csdn.net/questions/156861 看一下别人怎么解决的[/quote]   最后一个问题哈！！结帖就给分了! 这里main函数中的指针b接受了fun函数返回的地址pa，这里的pa应该只是a[10]数组的首地址把，只是一个确切的地址的值（假如是00fff06a）。那么b接受到的也是这个地址00fff06a。那么析构掉fun，回到main函数。那么fun中的数组被析构掉了。。那么此时main中的printf到底能不能打印出来字符串呢？我觉得是不行的，因为内存被清空了，b只是一个地址，没有什么东西可以打印。。但是我之前好像遇到过打印出来的问题！！我这边gcc出问题了，你先帮我解答下！

user: user-2
content: 引用 9 楼 hu1991514 的回复:[quote=引用 8楼自信男孩 的回复:][quote=引用 7 楼 hu1991514 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。  帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?[/quote]bin文件夹里有g++.exe！你值得是这么[/quote] 应该是没有配置环境变量；  http://ask.csdn.net/questions/156861 看一下别人怎么解决的

user: user-0
content: 引用 8楼自信男孩 的回复:[quote=引用 7 楼 hu1991514 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。  帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?[/quote]bin文件夹里有g++.exe！你值得是这么

user: user-2
content: 引用 7 楼 hu1991514 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。  帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。   帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！

user: user-0
content: 引用 5楼自信男孩 的回复:return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。哥们优秀，每次回答的都是我想要的！

user: user-2
content: return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。

user: user-0
content: 引用 2楼paschen 的回复:%s 就是表示输出指向的字符串，如果你要输出p的地址，用%p我这里不只要输出地址！第一次字符串被输出时，用的是指针p作为printf函数参数！而打印3，用的是变量a作为printf函数参数！a跟p是两个不同的概念，一个是指针一个是变量名，为什么最后打印出来的都是里面的值

user: user-0
content: 引用 1楼paschen 的回复:你这里返回是按值返回的，也就是说，在局部变量a析构前，会对a进行复制，函数外接收的实际是一个复制后的值，如果你返回&a，函数外用*a则可能导致出错请问下，这里返回值复制到什么地方，因为fun函数栈是先被释放掉的，才在main函数中被变量接受，那被接受之前是在哪里！