免费注册 查看新帖 |

Chinaunix

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

[C] 全局和局部的结构体疑惑 [复制链接]

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-01 16:56 |只看该作者 |倒序浏览
遇到一个小问题,代码如下:
  1. #define MAX_SIZE 10
  2. typedef struct ST_Stack{
  3.     int stack[MAX_SIZE];
  4.     int size;
  5. }Stack;

  6. Stack *inQ = (Stack*)malloc(sizeof(Stack));
  7. Stack *outQ = (Stack*)malloc(sizeof(Stack));
  8. int main()
  9. {
  10. ....
  11. return 0;
  12. }
复制代码
两个变量inQ和outQ在main()外存在问题,错误:初始值设定元素不是常量。
放到main()内部则没有问题。

从网上搜一下,说是函数得在main内部使用。
哪位再给点介绍呗。


另外:
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

s1是在栈上,s2是在堆上还是在栈上?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
2 [报告]
发表于 2014-12-01 17:54 |只看该作者
Stack *inQ = (Stack*)malloc(sizeof(Stack));
malloc函数在什么时候被调用?

就算可以调用,
全局变量你直接用
Stack inQ;
就行了,
malloc多此一举。

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
3 [报告]
发表于 2014-12-01 17:56 |只看该作者
har s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";

s1是在栈上,s2是在堆上还是在栈上?

如果在函数中, s1和s2在堆栈上, "aaaaaaaa" "bbbbb"基本在恒量区。
如果不在函数中, 它们都在常量区

论坛徽章:
5
戌狗
日期:2014-06-09 10:29:10酉鸡
日期:2014-12-01 16:05:27处女座
日期:2015-01-07 18:35:262015亚冠之水原三星
日期:2015-06-03 09:26:222015亚冠之布里斯班狮吼
日期:2015-06-15 10:53:54
4 [报告]
发表于 2014-12-01 18:05 |只看该作者
回复 2# folklore


    多谢!
    我明白你的意思,我想知道为什么不能在main之前用malloc?

论坛徽章:
59
2015年亚洲杯之约旦
日期:2015-01-27 21:27:392015年亚洲杯之日本
日期:2015-02-06 22:09:41拜羊年徽章
日期:2015-03-03 16:15:432015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015元宵节徽章
日期:2015-03-06 15:50:392015年亚洲杯之阿联酋
日期:2015-03-19 17:39:302015年亚洲杯之中国
日期:2015-03-23 18:52:23巳蛇
日期:2014-12-14 22:44:03双子座
日期:2014-12-10 21:39:16处女座
日期:2014-12-02 08:03:17天蝎座
日期:2014-07-21 19:08:47
5 [报告]
发表于 2014-12-01 19:30 |只看该作者
回复 4# kaede_1


    因为C语言只有一个入口点, 其实地方的程序无法被执行。
(你想想如果有两个以上入口点, 那因为执行顺序不同, 结果也不同)

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
6 [报告]
发表于 2014-12-01 19:41 |只看该作者
这个应该设计很多编译链接等原理,我也不懂,但是我觉得这主要是由于C语言机制造成的吧!
网上有很多帖子说的都是C++可以弄一个全局对象,通过全局对象的构造函数,来实现。在编译这个程序的时候,C中会有全局变量的初始化等等, 但是没有听说过你这种方式的。C程序的入口都是main函数,如果要是反汇编一段C语言代码,可能能够说明问题?论坛里哪位大神给大家讲一下?回复 4# kaede_1


   

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
7 [报告]
发表于 2014-12-01 20:11 |只看该作者
#include <stdio.h>

void my_init(void) __attribute__((constructor));
void my_init(void)
{
    printf("hello world\n");
}
int main()
{
    return 0;
}
这个函数可以在main函数前执行!

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
8 [报告]
发表于 2014-12-01 20:15 |只看该作者
#include <stdio.h>
#include <stdlib.h>
int *a;
void my_init(void) __attribute__((constructor));
void my_init(void)
{
    a=malloc(sizeof(int));
    printf("hello world\n");
}
int main()
{
    return 0;
}

所以利用这个特性,可以这样实现,不知道这样是否能够满足你的要求,在C++中有全局变量构造函数,事实上也是由编译器注册到main函数执行前的全局变量构造函数的链表上的。这里相当于手动构造。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP