c语言常见编程错误编程常见问题解答之系统调用

等级:书童 |
您现在的位置:&>>&&>>&&>>&&>>&文章内容
C语言编程常见问题解答之变量和数据存储
日来源:233网校
&第2章&&变量和数据存储 &&&&C语言的强大功能之一是可以灵活地定义数据的存储方式。C语言从两个方面控制变量的性质:作用域(scope)和生存期(lifetime)。作用域是指可以存取变量的代码范围,生存期是指可以存取变量的时间范围。 &&&&作用域有三种: &&&&1.&extern(外部的)&&这是在函数外部定义的变量的缺省存储方式。extern变量的作用域是整个程序。 &&&&2.static(静态的)&&在函数外部说明为static的变量的作用域为从定义点到该文件尾部;在函数内部说明为static的变量的作用域为从定义点到该局部程序块尾部。 &&&&3.auto(自动的)&&这是在函数内部说明的变量的缺省存储方式。auto变量的作用域为从定义点到该局部程序块尾部。 &&&&变量的生存期也有三种,但它们不象作用域那样有预定义的关键字名称。第一种是extern和static变量的生存期,它从main()函数被调用之前开始,到程序退出时为止。第二种是函数参数和auto变量的生存期,它从函数调用时开始,到函数返回时为止。第三种是动态分配的数据的生存期,它从程序调用malloc()或calloc()为数据分配存储空间时开始,到程序调用free()或程序退出时为止。 &&&&2.1&&变量存储在内存(memory)中的什么地方? &&&&变量可以存储在内存中的不同地方,这依赖于它们的生存期。在函数外部定义的变量(全局变量或静态外部变量)和在函数内部定义的static变量,其生存期就是程序运行的全过程,这些变量被存储在数据段(datasegment)中。数据段是在内存中为这些变量留出的一段大小固定的空间,它分为两部分,一部分用来存放初始化变量,另一部分用来存放未初始化变量。 &&&&在函数内部定义的auto变量(没有用关键字static定义的变量)的生存期从程序开始执行其所在的程序块代码时开始,到程序离开该程序块时为止。作为函数参数的变量只在调用该函数期间存在。这些变量被存储在栈(stack)中。栈是内存中的一段空间,开始很小,以后逐渐自动增大,直到达到某个预定义的界限。在象DOS这样的没有虚拟内存(virtual&memory)的系统中,这个界限由系统决定,并且通常非常大,因此程序员不必担心用尽栈空间。关于虚拟内存&的讨论,请参见2.3。&&&& &&&&第三种(也是最后一种)内存空间实际上并不存储变量,但是可以用来存储变量所指向的数据。如果把调用malloc()函数的结果赋给一个指针变量,那么这个指针变量将包含一块动态分配的内存的地址,这块内存位于一段名为“堆(heap)”的内存空间中。堆开始时也很小,但当程序员调用malloc()或calloc()等内存分配函数时它就会增大。堆可以和数据段或栈共用一个内存段(memorysegment),也可以有它自己的内存段,这完全取决于编译选项和操作系统。 &&与栈相似,堆也有一个增长界限,并且决定这个界限的规则与栈相同。 &&&请参见: &&&&1.1&&什么是局部程序块(10calblock)? &&&&2.2&&变量必须初始化吗? &&&&2.3&&什么是页抖动(pagethrashing)? &&&&7.20&什么是栈(stack)? &&&&7.21&什么是堆(heap)7&&&&. &&&&2.2&&变量必须初始化吗? &&&&不。使用变量之前应该给变量一个值,一个好的编译程序将帮助你发现那些还没有被给定一个值就被使用的变量。不过,变量不一定需要初始化。在函数外部定义的变量或者在函数内部用static关键字定义的变量(被定义在数据段中的那些变量,见2.1)在没有明确地被程序初始化之前都已被系统初始化为0了。在函数内部或程序块内部定义的不带static关键字的变量都是自动变量,如果你没有明确地初始化这些变量,它们就会具有未定义值。如果你没有初始化一个自动变量,在使用它之前你就必须保证先给它赋值。 &&&&调用malloc()函数从堆中分配到的空间也包含未定义的数据,因此在使用它之前必须先进行初始化,但调用calloc()函数分配到的空间在分配时就已经被初始化为0了。 &&&&请参见: &&&&1.1&&什么是局部程序块(10calblock)? &&&&7.20&什么是栈(stack)? &&&&7.21&什么是堆(heap)? &&&&2.3&&什么是页抖动(pagethrashing)? &&&&有些操作系统(如UNIX和增强模式下的Windows)使用虚拟内存,这是一种使机器的作业地址空间大于实际内存的技术,它是通过用磁盘空间模拟RAM(random―access&memory)来实现的。
责编:daiy&&&
课程专业名称
原价/优惠价
¥150 / ¥100
¥150 / ¥100
¥150 / 100
¥150 / ¥100
¥150 / ¥100
¥150 / ¥100
¥150 / ¥100文章类别:
分站:                       
> 文章正文
C语言编程常见问题解答之杂项(Miscellaneous)(2)(1)
&& 日期:2005 - 12 - 27 && 查看次数:
注: 报名时说明来自神州培训网!
P>&&& 请参见:&&& 20.12怎样把数据从一个程序传递到另一个程序?&&& 20.17可以使热启动(Ctrl+Alt+Delete)失效吗?&&& 21.10什么是动态连接?&&& 20.9 为什么要使用静态变量&&& 静态变量(神州培训网-/article/view/33559)作为一个局部变量是很合适的,它在函数退出后不会失去其本身的值。例如,有一个要被调用很多次的函数,它的一部分功能就是计算自己被调用的次数。你不能用一个简单的局部变量来实现这部分功能,因为每次进入该函数时,这个变量都没有被初始化。如果把这个计数变量说明为静态的,那么它就会象一个全局变量那样保留自己的当前值。&&& 那么为什么不直接使用一个全局变量呢?你可以使用一个全局变量,而且这样做没有错误。问题是使用了大量全局变量的程序维护起来很麻烦,尤其是有许多函数都各自访问一个全局变量的程序。再说一遍,这样做没有错误,这只是一个程序设计和可读性是否好的问题。如果你把这样的变量说明为静态的,你就可以提醒自己(或者其它可能读你的程序的人)它是局部变量,但要象全局变量那样被处理(保留自己的值)。如果你把它说明为全局的,那么读这个程序的人一定会认为有很多地方要引用它,尽管实际上并不是这样。&&& 总而言之,当你需要一个能保持自己的值的局部变量时,使用静态变量是一种好的编程习惯。&&& 请参见:&&& 2.17可以头文件中说明static变量吗?&&& 20.10 怎样在一个程序后面运行另一个程序?&&& 显然,在一个程序后面运行另一个程序的最简单的办法是把它们依次列入一个批处理文件中,在执行该批处理文件时,其中所列的程序就会依次运行。然而,这是一种人们已经知道的办法。&&& 在c或DOS中,都没有一种特定的方法来完成“在一个程序结束后运行另一个程序”这样一种函数调用。然而,c提供了两组函数,它们允许一个程序随时可以运行另一个程序,而后者的运行将结束前者的运行。如果你将这样的一个函数调用放到第一个程序的末尾,你就能达到上述目的。C所提供的这两组函数实际上是由exec()和spawn()所代表的两个函数族,其中的每一个函数都具有一种区别于同族其它函数的功能。exec()函数族包括这样一些成员:execl(),execle(),execlp(),execlpe(),execv(),execve(),execvp()和execvpe()。下面列出了这此函数名中的e,l,p和v等后缀的含义:&&& e&&& 明确地把一个指向环境参数的指针数组传递给子进程&&& l&&& 把命令参数逐个传递给要执行的程序&&& p&&& 通过环境变量PATH找到要执行的文件&&& v&&& 把命令行参数以一个指针数组的形式传递给要执行的程序&&& 在程序中选用哪一个函数完全取决于你以及要执行的程序的需要。下例中的程序调用了其参数由命令行指定的另一个程序:# include &stdio. h&# include &process. h&char * envString[] = {&&&&&&&&&&&&&&&& / * environment for the app * /&&&&& “COMM VECTOR=0x63“,&&&&& /* communications vector */&&&&& “PARENT=LAUNCH. EXE“,&& / * name of this app * /&&&&& “EXEC=EDIT. COM“,&&&&&&&&&& / * name of app to exec * /&&&&& NULL} ;&&&&&&&&&&&&&&&&&&&&&&&&& / * must be NULL-terminated * /voidmain(int argc, char **argv){&&&&& / * Call the one with variable argumets and an enviroffment * /&&&&& _execvpe (“ EDIT. COM“, argv, envString ) ;&&&&& printf(“If you can read this sentence, the exec didn‘t happen!\n“) ;}&& 上面这个短小的例子调用_execvpe()来执行DOS的文件编辑器EDIT.COM,EDIT程序的参数来自该例的命令行。在调用execvpe()函数后,上例中的程序就结束了;当EDIT程序退出时,你将返回到DOS提示符。如果printf()语句的打印内容显示在屏幕上,则说明_execvpe()函数调用出了问题,因为如果它调用成功,就不会有上述结果。注意,上例所提供的的环境变量是没有任何意义的,然而,如果上例要执行一个需要环境变量的程序,那么所提供的环境变量就能供该程序使用了。&&& 用spawn()函数同样可以完成上例所做的工作。spawn()函数族包括这样一些成员:&&& spawnl(),spawnle()。spawnlp(),spawnlpe(),spawnv(),spawnve(),spawnvp()和spawnvpe()。这些函数名中的e,l,p和v等后缀的含义与exec()族函数名中的相同。实际上,spawn()函数族与exec()函数族基本相同,只不过有一点小小的差别——spawn()函数既可以在结束原来的程序后启动另一个程序,也可以启动另一个程序并在该程序结束后返回到原来的程序。spawn()函数的参数与exec()函数的基本相同,只不过需要增加一个参数一你必须用_P_OVERLAY(结束原来的程序)或_P_WAIT(结束后返回到原来的程序)作为spawn()函数的第一个参数。下例用spawn()函数完成了与前面的例子相同的工作:# include &stdio. h&# include &process. h&char * envString[] = {&&&&&&&&&&&&&&&& / * environment for the app * /&&&&& “COMM VECTOR = 0x63“,&&&& / * communications vector * /&&&&& “PARENT=LAUNCH. EXE“,&& / * name of this app * /&&&&& “EXEC=EDIT. COM“ ,&&&&&&&&&& / * name of app to exec * /&&&&& NULL} ;&&&&&&&&&&&&&&&&&&&&&&&&& / * must be NULL-terminated * /voidmain(int argc, char **argv){&&&&& / * Call the one with variable argumets and an environment * /&&&& _spawnvpe (_P_OVERLAY, “EDIT. COM“, argv, envString) ;&&&& printf(“If you can read this sentence, the exec didn‘t happen!\n“ );}&&& 这里唯一的区别是“exec”变为“spawn“,并且增加了模式(mode)参数。spawn()函数有覆盖和等待两种相对立的功能,它使你可以在spawn()运行期间做出是等待还是离开的决定。实现上,P_WAIT参数回答了下一个问题。&&
文章标签:C语言编程常见问题解答之杂项(Miscellaneous)(2)(1),深圳学习资料,深圳C/C++
神州培训网汇集C语言编程常见问题解答之杂项(Miscellaneous)(2)(1),深圳学习资料,深圳C/C++ 更多相关文章信息
注: 报名时说明来自神州培训网!
相关专题文章
本网代发各种新闻、文章 联系QQ:
IT(电脑)&
计算机组装和维护&
计算机等级考试&
软件工程师&
DREAMWEAVER&
数据库开发&
网络工程师&
CCNA(思科)&
CCNP(思科)&
CCIE(思科)&
CISCO(思科)&
PHOTOSHOP&
CORELDRAW&
IIIUSTRATOR&
ACCD平面设计师&
CEAC平面设计师&
FrameMaker&
PageMaker&
FREEMARKER&
LightWave&
After Effects&
模具设计/工业设计&
Mastercam CAD/CAM&
Unigraphics(UG)&
Pro/ENGINEER(Pro/e)&
SolidWorks&
3G移动技术&
二维三维动漫&
装潢设计师&
室内手绘/手绘&
IT认证考试&
MACROMEDIA&
网络营销/推广&
计算机等级考试&
嵌入式、单片机培训&
嵌入式培训&
单片机培训&
智能移动终端考试&
网络推广/营销&
IT(电脑)专题
IT(电脑)资讯
IT(电脑)选课建议
IT(电脑)考试
IT(电脑)学习方法
深圳C++培训高级企业开发课
深圳C语言培训C++培训
深圳西乡招调工培训,包通过2月19日开课
深圳宝安招调工培训,2月12日开课
深圳宝安中心区招调工培训2月13日开课
西宁室内设计培训学校有哪些
西宁雅思英语一对一到哪里学
西宁想学兰州牛肉拉面
西宁哪里学办公自动化课程
西宁大通哪里学厨师
天津哪里有催乳师培训班
天津哪些地方可以学会计
天津想学阿根廷探戈
天津哪里法语培训最专业
天津南开区美容化妆学校有哪些
西宁室内设计培训学校有哪些
西宁想学兰州牛肉拉面
西宁大通哪里学厨师
天津哪些地方可以学会计
天津想学阿根廷探戈
天津南开区想学国际室内设计表现
Windows2000 server下的Apache2.0.46与Tomcat5.0.2的整合配置方
Servlet/JSP配置详解(非常基础)
Tomcat5和PostgreSQL配置开发JSP
在JSP-SERVLET开发中导入事件驱动技术《C语言编程常见问题解答》_百度知道
《C语言编程常见问题解答》
我想找《C语言编程常见问题解答》这本书来看,可是没地方买,也没地方下,谁可以给我提供我一个下载地址啊,感激不尽。 有个网站这书,但是有积分制,我还是下不了啊。。。 有没人能给我个可以直接下的地址啊?
提问者采纳
我有这本书,很愿意借给你,可惜是从图书馆借的,爱莫能助啊!!
提问者评价
其他1条回答
汗。。。。
等待您来回答
您可能关注的推广
下载知道APP
随时随地咨询
出门在外也不愁第l章& C语言
& 1. 1&& 什么是局部程序块(local block)?& & 1. 2&& 可以把变量保存在局部程序块中吗?& & 1. 3&& 什么时候用一条switch语句比用多条if语句更好?& 1. 4&& switch语句必须包含default分支吗?& 1. 5&& switch语句的最后―个分支可以不要break语句吗? & 1. 6&& 除了在for语句中之外,在哪些情况下还要使用逗号运算?& 1. 7&& 怎样才能知道循环是否提前结束了?& & 1. 8&& goto,longjmp()和setjmp()之间有什么区别?& 1. 9&& 什么是左值(lvaule)?& & 1. 10& 数组(array)可以是左值吗?& & 1. 11& 什么是右值(rvaule)?& & 1. 12& 运算符的优先级总能保证是“自左至右”或“自右至左”的顺序吗?& & 1. 13& ++var和var++有什么区别?& & 1. 14& 取模运算符(modulusoperator)“%”的作用是什么?& &&&&&&&&&&&&&&&&&&& & 第2章& 变量和数据存储
& 2. 1& 变量存储在内存(memory)中的什么地方?& & 2. 2& 变量必须初始化吗?& 2. 3& 什么是页抖动(pagethrashing)?& & 2. 4& 什么是const指针?& 2. 5& 什么时候应该使用register修饰符?它真的有用吗?& 2. 6& 什么时候应该使用volatile修饰符?& & 2. 7& 一个变量可以同时被说明为const和volatile吗? & 2. 8& 什么时候应该使用const修饰符?& 2. 9& 浮点数比较(floating―point comparisons)的可靠性如何?& 2. 10 怎样判定一个数字型变量可以容纳的最大值?& & 2. 11 对不同类型的变量进行算术运算会有问题吗?& & 2. 12 什么是运算符升级(operator promotion)?& 2. 13 什么时候应该使用类型强制转换(typecast)?& & 2. 14 什么时候不应该使用类型强制转换(typecast)? & 2. 15 可以在头文件中说明或定义变量吗?& & 2. 16 说明一个变量和定义一个变量有什么区别?& & 2. 17 可以在头文件中说明static变量吗?& & 2.18 用const说明常量有什么好处?&&& 第3章& 排序与查找
& 排 序& 查 找& 排序或查找的性能& 3.1& 哪一种排序方法最方便?& 3.2& 哪一种排序方法最快?& 3.3& 当要排序的数据集因太大而无法全部装入内存时,应怎样排序?& & 3.4& 哪一种查找方法最方便?& 3.5& 哪一种查找方法最快?& 3.6& 什么是哈希查找?& 3.7& 怎样对链表进行排序?& 3.8& 怎样查找链表中的数据?&& 第4章& 数据文件&& 4.1& 当errno为一个非零值时,是否有错误发生?& & 4.2& 什么是流(stream)?& 4.3& 怎样重定向―个标准流?& 4.4& 怎样恢复一个重定向了的标准流?& 4.5& stdout能被强制打印到非屏幕设备上吗?& 4.6& 文本模式(text mode)和二进制模式(binary mode)有什么区别?& & 4.7& 怎样判定是使用流函数还是使用低级函数?& 4.8& 怎样列出某个目录下的文件?& 4.9& 怎样列出―个文件的日期和时间?& 4.10 怎样对某个目录下的文件名进行排序?&
& 4.1l 怎样判定一个文件的属性?& & 4.12 怎样查看PATH环境变量?& 4.13 怎样打开一个同时能被其它程序修改的文件?& & 4.14 怎样确保只有你的程序能存取一个文件?& & 4.15 怎样防止其它程序修改你正在修改的那部分文件内容?& & 4.16 怎样―次打开20个以上的文件?& 4.17 怎样避开"Abort,Retry,Fail"消息?& 4.18 怎样读写以逗号分界的文本?&&& 第5章& 编译预处理&& 5.1& 什么是宏(macro)?怎样使用宏?& & 5.2& 预处理程序(preprocessor)有什么作用?& & 5.3& 怎样避免多次包含同―个头文件?& 5.4& 可以用#include指令包含类型名不是“.h”的文件吗? & 5.5& 用#define指令说明常量有什么好处?& 5.6& 用enum要害字说明常量有什么好处?& 5.7& 与用#define指令说明常量相比,用enum要害字说明常量有什么好处?& 5.8& 如何使部分程序在演示版中失效?& 5.9& 什么时候应该用宏代替函数?& 5.10 使用宏更好,还是使用函数更好?& 5.11 在程序中加入注释的最好方法是什么? & 5.12 #include&file&和#include“file”有什么不同? 首页 1
【】【】【】【】
ISBN编号:&8
出版时间:&2013-3
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&ISBN编号:&9
出版时间:&2013-4
出版社:&中国人事出版社
定价:¥45 优惠价:¥45&&
????????????
????????????
         Copyright ©
() All Rights Reserved

我要回帖

更多关于 c语言常见编程错误 的文章

 

随机推荐