4年的大学生活即将结束,实习期间重拾了不重视很久的C语言。看着程序,OMG,竟然发现问题不少。好了,那么仅以此篇BLOG作为我在博客园上的处女作,记录一下这些傻傻的、本应该清楚的问题。
公司里的程序使用PRO* C编写后台server。自从阅读这些程序以来,有个问题一直困惑着我。PRO* C(在此鄙视一下PRO* C,虽说一名优秀的程序员会更喜欢使用记事本或者notepad之类的文本编辑器写程序,但对于初级程序员来说,用PRO* C这种根本找不到IDE的C语言变种写程序的感觉简直糟糕透顶,编程效率实在太差了,而且由于没有基本的查错功能,因此也无法避免笔误!!!)是在EXEC SQL BEGIN DECLARE SECTION和EXEC SQL END DECLARE SECTION 中对后面SQL语句中的变量进行初始化的。在读程序的过程中经常可以看到诸如一下两种不同的申明(该死的上任程序员们一定没交流好):
1)int doFlag = 0; 与 int doFlag;
2)char value[3] = “”;与char value[3] = “ “;
那么到底他们之间的区别是什么呢?
首先对于1)来说,有一个局部变量与全局变量的前提,局部变量仅在自己的作用周期内可见,而全局变量在整个程序周期内均可见。“全局变量的内存分配是静态的,位于PE文件在数据区,在main()前由C、C++运行期函数初始化,如果没有初值,会被初始化为0。局部变量的内存分配是动态的,位于线程堆栈中。如果没有初始化的,初值视当前内存内的值而定。”【引号内引用CSDN cwanter的原话】总结下来,只有当变量申明为全局变量的时候,int doFlag才会被默认的置为0,而当变量为局部变量的时候, doFlag为未知值,具体要看被分配内存的值为多少。
第二,对于2)来说,value被赋予了3个字节(这里有个问题,3个字节的内存地址是连续的吗?待解决),char value[3] = “”意味着每个字节被赋予0x00,而
char value[3] =“ “则意味着三个字节分别被分配为0x20 0x00 0x00。如果仅仅是对value初始化,那么两者意义相同,但显然多打一个空格是没什么意义的。
以上这些解释只是自己上网查找询问得出,如果有错误还请大家指明,共同进步;)