这三个函数有问题吗?

风吹PP凉SS 2014-12-17 02:57:53
int *f1(void)
{
int x = 10;
return (&x);
}

int *f2(void)
{
int *ptr;
*ptr = 10;
return ptr;
}

int *f3(void)
{
int *ptr;
ptr = (int *)malloc(sizeof(int));
return ptr;
}


哪几个有问题?
...全文
413 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanzhong104204 2014-12-22
  • 打赏
  • 举报
回复
引用 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] 你是猴子请来的逗逼吗
sdhongjun 2014-12-19
  • 打赏
  • 举报
回复
引用 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类型的拷贝构造函数。 第一个函数用户对操作返回值会出现不确定性 第二个函数出现运行错误机率较大 第三个函数用户可以操作,但要用户释放内存。
sanzhong104204 2014-12-19
  • 打赏
  • 举报
回复
引用 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,也不能代表那样做是对的。
  • 打赏
  • 举报
回复
引用 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] 对于你这种无聊的人,我只能呵呵了
  • 打赏
  • 举报
回复
我只能说,我从来不纠结没意义的东西
bear234 2014-12-19
  • 打赏
  • 举报
回复
引用 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的地址有什么实际的意义,但从语法上,没有错
bear234 2014-12-19
  • 打赏
  • 举报
回复
引用 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发生了什么,也不明白到底什么叫“释放”
xusen1013 2014-12-18
  • 打赏
  • 举报
回复
不是释放x的地址,x的地址永远在那里,是程序不能再控制或者直接使用这块内存地址了,第二个是没有内存空间,就给你变量赋值,没地方存放啊
xusen1013 2014-12-18
  • 打赏
  • 举报
回复
这三个函数都有问题,问题稍微不太严重的是第三个,其他二个写出来应该就要被斩立决,第三个会造成内存泄露,记住内存在那里申请在那里释放
  • 打赏
  • 举报
回复
引用 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] 你是猴子请来的逗逼么?
bear234 2014-12-18
  • 打赏
  • 举报
回复
引用 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被释放了.............
bear234 2014-12-18
  • 打赏
  • 举报
回复
引用 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;
}
你确定第一个有问题??
  • 打赏
  • 举报
回复
第一个函数结束后,空指针。。。 第二个指针指向常量。。。
lm_whales 2014-12-17
  • 打赏
  • 举报
回复
对野指针所指内存写是错误的
lm_whales 2014-12-17
  • 打赏
  • 举报
回复
第三个没问题, 但是最好同时提供配套的释放函数。 因为不知道这个函数,是怎么分配内存的 在不能看到源代码的情况下, 不知道如何释放分配的内存 只有分配不去释放,会造成内存泄露。 例如: C标准库, 同时提供了 malloc 和 free 两个函数。 这样就不会有,分配了无法释放的问题。 第一,第二个都是有严重问题的,会产生莫名其妙的错误。 第一个,返回局部非静态变量的地址,是错误的 第二个局部非静态变量, 指针 ptr 没有初始化,是个野指针。 对野指针写是错误的, 函数返回野指针同样是错误的。
「已注销」 2014-12-17
  • 打赏
  • 举报
回复
只有第三个是对的
zhousitiaoda 2014-12-17
  • 打赏
  • 举报
回复
只有第三个没问题,但不推荐。
  • 打赏
  • 举报
回复

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;
}
jacksonfan 2014-12-17
  • 打赏
  • 举报
回复
第二个有问题,可以自己动手调试看看呗
int *f2(void)
{
    int *ptr;
     ptr = (int *)malloc(sizeof(int));
    *ptr = 10;
    return ptr;
}
wjm1990 2014-12-17
  • 打赏
  • 举报
回复
能运行,没问题啊
加载更多回复(1)
作为Microsoft 32位平台的应用程序编程接口, Win32 API是从事Windows应用程序开发所必备的。 首先对Win32 API函数做完整的概述;然后收录五大类函数: 窗口管理、图形设备接口、系统服务、国际特性以及网络服务; 在附录部分,讲解如何在Visual Basic和Delphi中对其调用。 本书是从事Windows应用程序开发的软件工程师的必备参考手册。 控件与消息函数 共91个函数 硬件与系统函数 共98个函数 设备场景函数 共73个函数 绘图函数 共105个函数 位图、图标和光栅运算函数 共39个函数 菜单函数 共37个函数 文本和字体函数 共41个函数 打印函数 共66个函数 文件处理函数 共118个函数 进程和线程函数 共40个函数 Windows消息函数 共11个函数 网络函数 共14个函数 目 录 第一章 Win32 API概论…………………………………………………………………………1 1.1 为什么使用Win32 API …………………………………………………………………1 1.2 Win32 API简介 …………………………………………………………………………1 1.3 综述………………………………………………………………………………………11 第二章 窗口管理函数(Windows Control Function) ……………………………………13 2.1 易用特性函数(Accessibility Features)…………………………………………13 2.2 按钮函数(Button)……………………………………………………………………20 2.3 插入标记(^)函数(Caret)…………………………………………………………21 2.4 组合框函数(Combo box) ……………………………………………………………24 2.5 通用对话框函数(Common Dialog Box) ……………………………………………25 2.6 标函数(Cursor)………………………………………………………………………36 2.7 对话框函数(Dialog Box)……………………………………………………………40 2.8 编辑控制函数(Edit Control)………………………………………………………54 2.9 图标函数(Icon)………………………………………………………………………54 2.10 键盘加速器函数(Keyboard Accelerator)……………………………………… 61 2.11 键盘输入函数(Keyboard InPut) …………………………………………………63 2.12 列表框函数(List box) ……………………………………………………………75 2.13 菜单函数(Menu) ……………………………………………………………………76 2.14 消息和消息队列函数(Message and Message Queue)……………………………90 2.15 鼠标输入函数(Mouse Input) ……………………………………………………100 2.16 多文档接口函数(Multiple Document Interface) ……………………………103 2.17 资源函数(Resource)………………………………………………………………105 2.18 滚动条函数(Scroll Bar)…………………………………………………………113 2.19 窗口函数(Window)…………………………………………………………………119 2.20 窗口类函数(Window Class)………………………………………………………144 2.21 窗口过程函数(Window Procedure)………………………………………………150 2.22 窗口属性函数(Window Property) ………………………………………………152 第三章 图形设备接口函数(Graphic Device Interface Function) …………………155 3.1 位图函数(Bitmap) …………………………………………………………………155 3.2 笔刷函数(Brush)……………………………………………………………………171 3.3 剪切函数(Clipping) ………………………………………………………………176 3.4 颜色函数(Color)……………………………………………………………………179 3.5 坐标空间与变换函数(Coordinate Space Transformation)……………………186 3.6 设备环境函数(Device Context) …………………………………………………195 3.7 填充形态函数(Filled shape) ……………………………………………………211 3.8 字体和正文函数(Font and Text)…………………………………………………215 3.9 ICM 2.0函数 …………………………………………………………………………238 3.10 线段和曲线函数(Line and Curve)………………………………………………295 3.11 图元文件函数(Metafile)…………………………………………………………300 3.12 多显示器函数(Multiple Display Monitors) …………………………………311 3.13 绘图函数和画图函数(Painting and Drawing)…………………………………313 3.14 路径函数(Path)……………………………………………………………………328 3.15 画笔函数(Pen) ……………………………………………………………………332 3.16 打印及打印假脱机程序函数(Printing and Print Spooler)…………………334 3.17 矩形函数(Rectangle) ……………………………………………………………371 3.18 区域函数(Region)…………………………………………………………………374 第四章 系统服务函数(System Service Function) ……………………………………383 4.1 访问控制函数(Access Control) …………………………………………………383 4.2 原子函数(Atom) ……………………………………………………………………406 4.3 客户/服务器访问控制函数(Client/Server Access Control) ………………409 4.4 剪贴板函数(Clipboard)……………………………………………………………431 4.5 通信函数(Communication)…………………………………………………………436 4.6 控制台函数(Console)………………………………………………………………444 4.7 数据解压库函数(Data Decompression Library) ………………………………463 4.8 调试函数(Debugging)………………………………………………………………466 4.9 设备输入输出函数(Device Input and Output)…………………………………472 4.10 动态数据交换函数(Dynamic Data Exchange) …………………………………474 4.11 动态数据交换管理函数(Dynamic Data Exchange Management)………………476 4.12 动态链接库函数(Dynamic-Link Library)………………………………………489 4.13 错误函数(Error) …………………………………………………………………496 4.14 事件日志函数(Event Logging) …………………………………………………499 4.15 文件函数(File)……………………………………………………………………503 4.16 文件安装库函数(File Installation Library) ………………………………542 4.17 文件映射函数(File Mapping)……………………………………………………546 4.18 文件系统函数 File System)………………………………………………………551 4.19 句柄和对象函数(Handle and Object)………………………………………………556 4.20 挂钩函数(Hook)………………………………………………………………………560 4.21 ImageHlp函数…………………………………………………………………………572 4.22 大整数操作函数(Iarge Integer Operations)……………………………………594 4.23 低层访问控制函数(Low-Level Access Control)………………………………596 4.24 LSAPI函数 …………………………………………………………………………617 4.25 邮槽函数(Mailslot)………………………………………………………………622 4.26 内存管理函数(Memory Management) ……………………………………………623 4.27 管道函数(Pipe) …………………………………………………………………655 4.28 电源管理函数(Power Management) …………………………………………… 663 4.29 进程和线程函数(Process and Thread)…………………………………………666 4.30 注册表函数(Registry)……………………………………………………………700 4.31 字符串操作函数(String Manipulation)……………………………………… 724 4.32 结构化异常处理函数(Structured Exception Handling) ……………………742 4.33 同步函数(Synchronization) ……………………………………………………745 4.34 系统信息函数(System Information)……………………………………………766 4.35 系统消息函数(System Message)…………………………………………………780 4.36 系统关机函数(System Shutdown) ………………………………………………781 4.37 磁带备份函数(Tape Backup) ……………………………………………………783 4.38 时间函数(Time)……………………………………………………………………789 4.39 计时器函数(Timer) ………………………………………………………………795 4.40 工具帮助函数(Tool Help) ………………………………………………………796 4.41 窗口站和桌面函数(Window Station and Desktop)……………………………799 4.42 Windows NT 4.0访问控制函数(Window NT 4.0 Access-Control)……………808 4.43 WinTrust函数(WinTrust)…………………………………………………………814 第五章 国际特性函数(International Peatures Punction)时性…………………………815 5.1 输入方法编辑函数(Input Method Editor)…………………………………………815 5.2 国家语言支持函数(National Language Support)………………………………… 828 5.3 Unicode和字符集函数(Unicode and Character Set)……………………………… 843 第六章 网络服务函数(Networding Service Function)……………………………………849 6.1 数据链路控制函数(DLC)………………………………………………………………849 6.2 网络函数(Net)…………………………………………………………………………849 6.3 NetBIOS函数……………………………………………………………………………896 6.4 网络DDE函数(Networking DDE)……………………………………………………897 6.5 RAS服务器管理函数(RAS Server Administration)………………………………901 6.6 远程访问服务函数(Remote Access Administration)………………………………910 6.7 服务函数(Service)……………………………………………………………………929 6.8 Windows网络函数(Windows Networking)……………………………………………930 附录1 如何在VB中调用DLL API ……………………………………………………………945 1 DLL API的声明……………………………………………………………………………945 2 DLL API的调用……………………………………………………………………………947 附录2 在Delphi中直接调用Windows API…………………………………………………953

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧