c语言报数问题 报错问题

内存泄露一般是指程序申请了一块内存,使用完后,没有及时将这块内存释放,从而导致程序占用大量内存。
可以通过malloc(size_t)函数调用申请超过该机器物理内存大小的内存块。
无法通过内存释放函数free(void*)直接将某块已经使用完的物理内存直接还给操作系统。
可以通过内存分配函数malloc(size_t)直接申请物理内存。
内存泄漏也称作“存储渗漏
malloc申请的是虚拟内存,并不是物理内存。
虚拟内存是操作系统课里的知识了,虚拟内存即匀出一部分硬盘空间来充当内存使用,当需要用到这部分虚拟内存里的数据时,才将其调入到真实的物理内存。
malloc和free申请和释放的虚拟内存。
B为什么错?不是有段时管理么?申请的是虚假内存,就应该可以比物理的大啊?
malloc不初始化分配的内存,已分配的内存中可以是任意的值.
calloc初始化已分配的内存为0。
malloc不能直接申请物理内存,它申请的是虚拟内存
求分析一下B选项 ,
malloc申请的是虚拟内存!
malloc申请的是虚拟内存,而不是物理内存。
关于C答案,要注意,说的将内存还给物理内存所在的操作,这是不可能的,要注意理解 。
无法通过内存释放函数free(void*)直接将某块已经使用完的物理内存直接还给操作。
原来这里的“操作”指的是“操作系统”,也是够坑。
“malloc申请的是虚拟内存,并不是物理内存”这样的说法不够严谨,部分平台没有虚拟内存机制,所以这个答案应该错在过于绝对。
关于c和c++的内存分配问题??
malloc申请的是虚拟内存,而不是物理内存。
关于C答案,要注意,说的将内存还给物理内存所在的操作,这是不可能的,要注意理解 。
malloc函数申请的是虚拟内存
这道题你会答吗?花几分钟告诉大家答案吧!
贪心算法并不总能求...
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
京ICP备号-4
扫一扫,把题目装进口袋C语言程序的错误和警告C语言程序的错误和警告科技叫兽百家号一段代码,在编译、链接和运行的各个阶段都可能会出现问题。编译器只能检查编译和链接阶段出现的问题,而可执行程序已经脱离了编译器,运行阶段出现问题编译器是无能为力的。如果我们编写的代码正确,运行时会提示没有错误(Error)和警告(Warning),如下图所示:想要一起学习C++的可以加群,群内有各种资料满足大家图1:C-Free 5.0 的提示图2:VC 6.0 的提示错误(Error)表示程序不正确,不能正常编译、链接或运行,必须要纠正。警告(Warning)表示可能会发生错误(实际上未发生)或者代码不规范,但是程序能够正常运行,有的警告可以忽略,有的要引起注意。错误和警告可能发生在编译、链接、运行的任何时候。例如,puts("C语言")最后忘记写分号;,就会出现错误,如下图所示:图3:C-Free 5.0 的错误提示图4:VC 6.0 的错误提示可以看出,VC 6.0给出的错误信息更加丰富也更加科学,指出了具体的错误细节:请点击此想要一起学习C++的可以加群,群内有各种资料满足大家处输入图片描述图5:错误信息说明翻译:源文件 E:\cDemo\hello.c 第5行发生了语法错误,错误代码是 C2143,原因是 'return' 前面丢失了 ';'。我敢保证,你写的代码肯定会发生错误,一定要有分析错误的能力,这是一个合格的程序员必备的技能。本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。科技叫兽百家号最近更新:简介:没有科学和艺术,就没有人和人的生活。作者最新文章相关文章当前位置: >
> C语言的内存分配和段错误的处理
C语言的内存分配和段错误的处理
时间:作者:华清远见
在嵌入式的程序设计中对于程序变量的内存的管理尤为重要,因为嵌入式产品的内存资源十分有限,合理分配内存是程序设计人员优先考虑的问题。当然,一些变量的内存分配不合理有时会导致程序的崩溃(即是段错误)等错误。本文针对这些问题进行了详细的解析并给予合理的解决方案。
一、内存分配
在C语言中,当程序加载到内存前被组织成三部分:
静态存储区;
动态存储区。
1)代码段:将要执行程序的机器语言表示。即是我们通常所说的可执行的二进制代码。
2)静态存储区:变量的存储空间被系统静态分配,在程序的编译和链接时分配。
3)动态存储区:变量的存储空间被系统动态分配,在程序的调用和执行时分配。
如下程序为一个测试内存分配和段错误的代码:
程序执行结果:
静态存储区:主要存放的全局(global)的和静态(static)的数据。
如上程序中,在man()函数之前的一些变量的定义都属于静态存储区。而静态存储区又可以细分为已经初始化的变量和未初始化(BSS)的变量。
测试程序中,初始化的变量打印出的就是初始化的值,而没有初始化的全局变量,他们的值是唯一的:整型变量值为0,浮点型的变量其值为0.000000,字符型的变量其值为:&\0&,指针型的变量其值为NULL。大家看执行的结果可以发现,未初始化的全局变量都是这些固定的&零&值。
而static修饰的变量无论是局部的还是全局的未初始化时其值都为0(如上测试程序中的st、st1的值),对于static修饰的局部变量,会保存上一次执行结果的值,而一般的局部变量的值在程序调用时分配,调用结束时释放,再次进入子函数时重新分配值,如上程序代码中,a的值每一次都会重新赋值(加1后值为1),而b的值保存了函数执行结果的值,再次进入时其值在其基础上加1,于是出现了a的值一直为1,b的值累加。
动态存储区:分为堆区和栈区。
堆区(heap):malloc()函数调用时分配。如上测试代码中第42行的语句,通过malloc()系统在内存中开辟一块sizeof(int)大小的合适的空间,并返回一个指针给pt2,需要指出所谓合适的空间是指分配合法的内存空间,这样pt2就有了一个合法的地址指向了一块分配好的内存空间。
栈区(stack):存放的是局部变量和形参,函数的返回地址也存放在这里。如上测试代码中,局部变量未初始化时系统为局部变量赋的值为随机值,打印结果证实了这些打印的随机值。当然普通的变量赋随机值没有太大影响,但是当定义一个局部的指针变量时,有时候就会出现一些莫名其妙的错误,如段错误等,关于段错误后面会详细讲解。
补充:变量的生存期问题:
系统在给我们程序中的变量申请内存空间的时候,会根据变量的内存分配情况来决定此变量的生存期。
对于全局的变量,它的生存期是从变量分配内存空间开始,到整个程序的结束才释放空间。所以全局变量的生存期很长,会长时间占用内存资源,不是必要的时候一般不建议申请全局的变量。
对于局部变量来说,它的生存期就比全局变量短得多,在程序的调用时在堆空间申请,调用结束后就释放了所申请的这段空间,资源的利用率高,因此一般建议申请局部变量来节省内存的宝贵资源。
对于static修饰的变量,所修饰的是全局还是局部变量,它的意义是不一样的。当static修饰的是全局变量时,所关注的就是这个变量的作用域问题,就是说:被static限定的全局变量只是在本文件中有效,只能被本文件的函数调用,因此可以避免在其他的文件中引起错误,当然此变量的生存期还是从产生到程序结束释放。当static修饰的是局部变量的时候,所关注的就是它的生存期问题了,不再像普通的局部变量,函数调用结束空间释放,而是保存了上一次函数执行结果的值,在整个程序结束时才释放空间。
对于malloc()申请的变量,系统会在堆区开辟对应大小的空间,但是这个空间被申请好了就不会自动释放,必须手动申请和手动释放,利用free()函数释放空间。
二、段错误
在程序设计中经常遇到段错误的问题,在程序的编译链接过程中并不报错,但是在程序运行的时候就会出现段错误,让程序设计人员摸不到头脑,即便是经验丰富的程序员也难免出现段错误。而所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,例如:访问了空指针,对一个没有给予确切地址的指针变量的引用和赋值等。
1)几种典型的段错误
1. 对常量赋值
int main(void){
char*s =&hello world&;
*s ='H';
被装载时,系统把&hello world& 连同其它的字符串和const型数据放入到内存的只读区。执行时,一个变量s被设为指向该字符串的位置,当再试图向该位置写时,就会产生段错误。
2,操作空指针
int*ptr = NULL;
因为该代码只创建了一个空指针,并没有指向一个具体空间,当赋值时,产生段错误。
3,给一个没有明确地址的空间赋值
int *(为局部变量)
因为定义的是局部的变量,所以pt中装的是一个随机的指针,这个地址有可能是一个非法的地址(例如:是一个指向代码段的地址),就会造成内存操作错误,甚至会导致系统的奔溃,所以导致了段错误。
4,无限递归
int main(void){
无限递归,这会导致栈溢出,也会产生段错误。
如下程序中是一个段错误的代码:
这是对空指针所在的内存区域进行了操作,而这个内存区域通常是不可访问的禁区,当然就会出错了。我们尝试编译运行它:
出现了段错误。
针对段错误,我们可以利用gdb逐步查找错误:
具体步骤:
1.编译:gcc -g(生成调试级别) -dynamic XXX.c
2.gdb ./a.out //调试可执行的程序
3.输入r (运行代码)
4.可以看到出错的代码
这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以我们加上&-g -rdynamic&的参数进行编译,然后用gdb调试运行这个新编译的程序,具体步骤如下:
从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man 7 signal),我们知道SIGSEGV默认handler的动作是打印&段错误&的出错信息,并产生Core文件,由此我们又产生了方法二。
方法二:分析core文件
具体步骤:
1.编译成调试级别的可执行文件
gcc -g XXX.c
2.生成core文件
3.按如下步骤:
4.锁定出错的代码
当然除了这些定位段错误的方法以外,还有其他的方法来对段错误进行定位查找,例如使用objdump -d a.out(elf)进行反汇编,但是要求程序设计人员能看得懂这些晦涩难懂的汇编代码等。个人感觉,通过GDB调试工具进行查找更加快捷方便,有大量编程经验的程序设计人员当然也能不通过工具直接查看代码找到引起段错误的代码段。
学院新动态
高端IT就业培训专家
全国分校区
关注华清远见
关注创客学院
前台专线:010-
企业培训洽谈专线:010-
院校合作洽谈专线:010-
Copyright ©
北京华清远见科技发展有限公司 版权所有 ,京ICP备号,京公海网安备03号在C语言编程中一直遇到的一个语法报错问题
[问题点数:40分,结帖人qq_]
在C语言编程中一直遇到的一个语法报错问题
[问题点数:40分,结帖人qq_]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2016年5月 总版技术专家分月排行榜第二
2016年10月优秀大版主2016年8月论坛优秀大版主
2016年5月 总版技术专家分月排行榜第二
2016年10月优秀大版主2016年8月论坛优秀大版主
匿名用户不能发表回复!|}

我要回帖

更多关于 c语言 s报错 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信