免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: stronggirl
打印 上一主题 下一主题

请大家帮我看看,为什么有的变量加上static关键字就core dump [复制链接]

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
11 [报告]
发表于 2010-06-04 16:48 |只看该作者
看不出static在这里跟core dump会有什么关系。

不过,最好不要在头文件中定义变量,特别是静态变量。你这样,会使得每个包含该头文件的c文件,都定义了一个作用域为该c文件的static变量。

有例为证:
  1. $ cat common.h
  2. #ifndef COMMON_H
  3. #define COMMON_H

  4. static int x;

  5. #endif
复制代码
  1. $ cat a.c
  2. #include "common.h"

  3. void
  4. fun_a (void)
  5. {
  6.   printf ("a.c::x = %d\n", x);
  7.   x++;
  8. }
复制代码
  1. $ cat b.c
  2. #include "common.h"

  3. void
  4. fun_b (void)
  5. {
  6.   printf ("b.c::x = %d\n", x);
  7.   x++;
  8. }
复制代码
  1. $ cat main.c
  2. #include "common.h"

  3. int
  4. main (void)
  5. {
  6.   x = 10;
  7.   printf ("main.c::x = %d\n", x);
  8.   fun_a ();
  9.   fun_a ();
  10.   fun_b ();
  11.   fun_b ();
  12.   return 0;
  13. }
复制代码
  1. $ gcc main.c a.c b.c
  2. $ ./a.out
  3. main.c::x = 10
  4. a.c::x = 0
  5. a.c::x = 1
  6. b.c::x = 0
  7. b.c::x = 1
复制代码

论坛徽章:
0
12 [报告]
发表于 2010-06-04 17:07 |只看该作者
头文件引用说白了就是在C文件中直接展开头文件代码.

论坛徽章:
0
13 [报告]
发表于 2010-06-04 17:37 |只看该作者
在头文件里定义一个全局变量,它具有external的linkage;定义全局变量的时候添加static,使得它只在编译单元内可见,这样的话,会使编译器认为这是一个在别的地方定义的东西,因此直接去引用它,而它作为external的变量,不会被分配空间,因此访问非法内存,core dump了。

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
14 [报告]
发表于 2010-06-04 21:53 |只看该作者
本帖最后由 yulihua49 于 2010-06-04 21:58 编辑
大家好,我现在遇到一个比较棘手的问题,我的程序一个头文件定义了变量

a.h
static int tmptsta_index[ ...
stronggirl 发表于 2010-06-04 11:36



    静态变量不要定义在.h里,如果多个.c include了一个.h,会产生大量私有的互不相干的变量。
全局变量也不要定义在.h里,如果多个.c include了一个.h,会产生变量重复定义。也有的编译器不产生重复定义,但运行结果逻辑混乱。
全局变量可以《定义》在某个.c里,由某个.h《声明》之。注意术语,《定义》和《声明》的区别。

xx.c:
int g_status;

xx.h:
extern int g_status;

论坛徽章:
0
15 [报告]
发表于 2010-06-07 09:05 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
16 [报告]
发表于 2010-06-07 09:15 |只看该作者
static变量本来就有文件/模块作用域,你写在.h文件里没有用啊

论坛徽章:
0
17 [报告]
发表于 2010-06-08 21:47 |只看该作者
gdb
dbx调试

论坛徽章:
0
18 [报告]
发表于 2010-06-09 09:12 |只看该作者
在头文件里定义一个全局变量,它具有external的linkage;定义全局变量的时候添加static,使得它只在编译单元 ...
fera 发表于 2010-06-04 17:37



    说的对static全局变量一个文件内(编译单元? )有效

论坛徽章:
0
19 [报告]
发表于 2010-06-09 13:19 |只看该作者
应该是static占用空间过大所致。
1. EricFisher 已经说的很明白了,你先把你的static放在需要的.c里去,不要放在.h里边;
2. 减小NATIONAL_STA_NUM的值;
做到这两点应该就没什么问题了。

论坛徽章:
0
20 [报告]
发表于 2010-12-18 11:19 |只看该作者
感觉13楼的回复 比较有说服力...
如果是内存过大引起的core 现在的系统都比较智能了吧,分配给程序的内存可以“无限”增加的。
比如 :
while(true)
{
    char *p = new char[1024];
}

这样的代码是否会由于内存不够分配core掉?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP