user-0 提问: 这三个函数有问题吗？

回复:
user: user-1
content: 引用 19 楼 bear234 的回复:[quote=引用 17 楼 s_a_n_ 的回复:] [quote=引用 13 楼 bear234 的回复:] [quote=引用 12 楼 q3733353520 的回复:] [quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............[/quote] int i=10; return i;返回变量的值，与i是否释放无关。 int i=10; return &i;返回变量的地址，而该变量在函数栈中申请，变量的地址在变量所属函数执行期间有效，函数结束后相应的栈已经失效了，地址也跟着失效，所以返回的地址里不一定保存有原来i的值。也就是说，即便你从返回的地址里取到了10，也不能代表那样做是对的。[/quote]  我在上面说过了   第一个只能说不合适  因为我想看一下x的地址，这总没错吧  当然对此指针的任何解引用都是不对的  我们不应该把程序的正常运行建立在程序员的“小心”上，所以如果能在返回值前面加const更好 总之，虽然我也不知道看一下x的地址有什么实际的意义，但从语法上，没有错[/quote] 你是猴子请来的逗逼吗

user: user-2
content: 引用 13 楼 bear234 的回复:[quote=引用 12 楼 q3733353520 的回复:] [quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............[/quote]  i会被系统回收了，返回的值自动调用int类型的拷贝构造函数。 第一个函数用户对操作返回值会出现不确定性 第二个函数出现运行错误机率较大 第三个函数用户可以操作，但要用户释放内存。

user: user-1
content: 引用 13 楼 bear234 的回复:[quote=引用 12 楼 q3733353520 的回复:] [quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............[/quote] int i=10; return i;返回变量的值，与i是否释放无关。 int i=10; return &i;返回变量的地址，而该变量在函数栈中申请，变量的地址在变量所属函数执行期间有效，函数结束后相应的栈已经失效了，地址也跟着失效，所以返回的地址里不一定保存有原来i的值。也就是说，即便你从返回的地址里取到了10，也不能代表那样做是对的。

user: user-3
content: 引用 13 楼 bear234 的回复:[quote=引用 12 楼 q3733353520 的回复:] [quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............[/quote]  对于你这种无聊的人，我只能呵呵了

user: user-3
content: 我只能说，我从来不纠结没意义的东西

user: user-4
content: 引用 17 楼 s_a_n_ 的回复:[quote=引用 13 楼 bear234 的回复:] [quote=引用 12 楼 q3733353520 的回复:] [quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............[/quote] int i=10; return i;返回变量的值，与i是否释放无关。 int i=10; return &i;返回变量的地址，而该变量在函数栈中申请，变量的地址在变量所属函数执行期间有效，函数结束后相应的栈已经失效了，地址也跟着失效，所以返回的地址里不一定保存有原来i的值。也就是说，即便你从返回的地址里取到了10，也不能代表那样做是对的。[/quote]  我在上面说过了   第一个只能说不合适  因为我想看一下x的地址，这总没错吧  当然对此指针的任何解引用都是不对的  我们不应该把程序的正常运行建立在程序员的“小心”上，所以如果能在返回值前面加const更好 总之，虽然我也不知道看一下x的地址有什么实际的意义，但从语法上，没有错

user: user-4
content: 引用 16 楼 q3733353520 的回复:[quote=引用 13 楼 bear234 的回复:] [quote=引用 12 楼 q3733353520 的回复:] [quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............[/quote]  对于你这种无聊的人，我只能呵呵了[/quote]   你自己去看你第一个函数的注释  x被释放，有问题 那我return任何函数内的量，他们在return后都会被释放 这是无聊有聊的问题吗？  而且你说第三个“不知道会怎样”，第三个人家明明就完全是对的ok？可见你完全不明白return发生了什么，也不明白到底什么叫“释放”

user: user-5
content: 不是释放x的地址，x的地址永远在那里，是程序不能再控制或者直接使用这块内存地址了，第二个是没有内存空间，就给你变量赋值，没地方存放啊

user: user-5
content: 这三个函数都有问题，问题稍微不太严重的是第三个，其他二个写出来应该就要被斩立决，第三个会造成内存泄露，记住内存在那里申请在那里释放

user: user-3
content: 引用 11 楼 bear234 的回复:[quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？

user: user-4
content: 引用 12 楼 q3733353520 的回复:[quote=引用 11 楼 bear234 的回复:] [quote=引用 4 楼 q3733353520 的回复:]  int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？[/quote]  你是猴子请来的逗逼么？[/quote]   首先，第三个肯定没问题，你居然说“不知会怎样”  其次，对于第一个，我看一下x的地址不行吗？只不过不能通过指针修改值罢了  所以函数的返回值前面加个const更好  但你不能说第一个就错了啊～～～  看了你对第三个函数的注释，我觉得你不知道return这句话发生了什么 一个函数里，int i = 10; return i; 可以吗？你别告诉我说i被释放了.............

user: user-4
content: 引用 4 楼 q3733353520 的回复: int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }    你确定第一个有问题？？

user: user-6
content: 第一个函数结束后，空指针。。。 第二个指针指向常量。。。

user: user-7
content: 对野指针所指内存写是错误的

user: user-7
content: 第三个没问题， 但是最好同时提供配套的释放函数。  因为不知道这个函数，是怎么分配内存的 在不能看到源代码的情况下， 不知道如何释放分配的内存  只有分配不去释放，会造成内存泄露。 例如： C标准库， 同时提供了 malloc 和 free 两个函数。 这样就不会有，分配了无法释放的问题。  第一，第二个都是有严重问题的，会产生莫名其妙的错误。 第一个，返回局部非静态变量的地址，是错误的 第二个局部非静态变量， 指针 ptr 没有初始化，是个野指针。 对野指针写是错误的， 函数返回野指针同样是错误的。

user: user-8
content: 只有第三个是对的

user: user-9
content: 只有第三个没问题，但不推荐。

user: user-3
content: int *f1(void) {     int x = 10;     return (&x);  //函数结束时会释放x的地址，有问题 }   int *f2(void) {     int *ptr;       *ptr = 10;  //出现断错误，指针指向了不该指向的地方     return ptr; }   int *f3(void) {     int *ptr;     ptr = (int *)malloc(sizeof(int));// 这种我猜测，分配的堆内存肯定可以用，                                                         //但是ptr是函数内定义的指针其内存地址被释放，不知会怎样     return ptr; }

user: user-10
content: 第二个有问题，可以自己动手调试看看呗 int *f2(void) {     int *ptr;      ptr = (int *)malloc(sizeof(int));     *ptr = 10;     return ptr; }

user: user-11
content: 能运行，没问题啊