免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8673 | 回复: 26
打印 上一主题 下一主题

如何判断申请很大数组是否成功? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-03 11:09 |只看该作者 |倒序浏览
本帖最后由 mgqw 于 2010-06-03 14:38 编辑

昨天去一个华为外包公司面试问到的这个问题,以前确实没有考虑过类似这样的问题:
比如在一个嵌入式系统上申请一个超级大的数组 int a[999999], 我如何知道这个数组是否申请成功了呢?
我当时回答是用malloc返回直判断是否为NULL来确定申请是否成功。

但malloc/free就使用原则来说,可以不有就尽量别用;有没有什么办法能判断int a[999999]是否申请成功呢??

论坛徽章:
0
2 [报告]
发表于 2010-06-03 11:37 |只看该作者
本帖最后由 star1983653 于 2010-06-03 11:44 编辑

这问题不考虑操作系统和编译器,单单就C语言本身没办法知道的吧。
在数据段和在栈上分配空间是不一样的。
我觉得:
在数据区分配的话,过大的数据,首先编译器会报错。其次通过编译,连接器会报错。
在栈上,也是编译器会报错,通过编译后要在运行时才能查的出来。

论坛徽章:
0
3 [报告]
发表于 2010-06-03 11:40 |只看该作者
本帖最后由 peidright 于 2010-06-03 11:43 编辑

{:3_191:},这个问题。。。。,。。。。能否有异常机制?

感觉分配失败, 直接就挂了。 考虑alloca? 从栈中分配? 这个会不会与malloc有类似的不适合呢?
,。。哎,还是很菜啊

论坛徽章:
0
4 [报告]
发表于 2010-06-03 12:55 |只看该作者
异常肯定是不行的。

论坛徽章:
0
5 [报告]
发表于 2010-06-03 13:09 |只看该作者
malloc如果申请失败了会发生段错误,在信号处理函数里面能捕捉到这种错误,在栈上分配内存过大了也会发生段错误,但是这时候在信号处理函数中就捕捉不到了

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
6 [报告]
发表于 2010-06-03 13:33 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2010-06-03 13:38 |只看该作者
malloc如果申请失败了会发生段错误,在信号处理函数里面能捕捉到这种错误,在栈上分配内存过大了也会发生段 ...
wwdwwd 发表于 2010-06-03 13:09

你听谁说的malloc失败就段错误??

论坛徽章:
0
8 [报告]
发表于 2010-06-03 13:44 |只看该作者
本帖最后由 shmild 于 2010-06-03 13:47 编辑

malloc失败是返回一个NULL值,判断返回值是否是NULL
new的话用不起来这招,只能捕获异常

论坛徽章:
0
9 [报告]
发表于 2010-06-03 15:05 |只看该作者
你听谁说的malloc失败就段错误??
cugb_cat 发表于 2010-06-03 13:38

不用听说,我测试过,linux下,当然不一定每次malloc分配失败都发生段错误,可能是分配的太大了才发生。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <signal.h>

  4. void signal_handler(int signo) {
  5.         printf("get signal %d\n",signo);
  6. }

  7. void test(void) {
  8.         int  *a = malloc(1000000000);
  9.         printf("%d\n",a[0]);
  10. }
  11. int main()
  12. {
  13.     struct sigaction act;
  14.     sigemptyset(&act.sa_mask);
  15.     act.sa_handler = signal_handler;
  16.     sigaction(SIGSEGV, &act, NULL);
  17.         test();
  18.         return 0;
  19. }
复制代码

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
10 [报告]
发表于 2010-06-03 15:23 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP