C语言中“段错误”出现的场景

 1 /*************************************************************************
 2     > File Name: goto.c
 3     > Author: Mr.Yang
 4     > Purpose:演示goto的用法 (段错误出现的场景)
 5     > Created Time: 2017年05月19日 星期五 18时36分23秒
 6  ************************************************************************/
 7
 8 #include <stdio.h>
 9 #include <stdlib.h>
10
11 int main(void)
12 {
13         int i = 0;
14         int n = 0;
15 start:
16
17         for(i = 0;i<10;i++)
18         {
19                 printf("enter a number between 0 and 10:");
20                 scanf("%d",&n);//当接收用户输入时,scanf函数中未加"&"符号,编译能通过,但是会出现“段错误”这样的错误提示
21                 if(n >10 || n < 0)
22                 {
23                         goto start;
24                 }
25                 else if(n == 0 )
26                 {
27                         goto location0;
28                 }
29                 else if(n == 1)
30                 {
31                         goto location1;
32                 }
33                 else
34                 {
35                         goto location2;
36                 }
37         }
38
39 location0:
40         printf("you entered %d\n",n);
41         goto end;
42
43 location1:
44         printf("you entered %d\n",n);
45         goto end;
46
47 location2:
48         printf("you entered between 2 and 10\n");
49
50 end:
51
52         return 0;
53 }
时间: 2024-11-12 21:16:56

C语言中“段错误”出现的场景的相关文章

为什么for(int i=0;i&lt;9;i++) 在c语言中是错误的?

显示表示,i 变量不可以在for中定义,必须在外面定义,这是为什么? 因为C99标准以前的C标准是不支持临时变量在for循环中定义的. C99标准就支持这样写.但是目前有些编译器并不怎么愿意支持C99标准,或者默认以C89模式进行编译执行. 如果你用的是Visual C++6.0的话,那没办法,那货早停止更新了,不可能支持C99了. 如果用的是gcc 的编译器(v3.0以上)的话,默认按C89编译.手动编译时加上-std=c99就行了能按C99标准编译,上面那样写就没问题了.比如: gcc -s

程序猿之---C语言细节24(段错误、类型提升、sizeof &#39;A&#39;)

主要内容:段错误.类型提升.sizeof  'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; int *p = (int *)&(u.a[1]); // 没有引起总线错误 *p = 17; printf("%d\n",*p); #if 0 int *q = 0; // 引起段错误,在linux中运行可看到段错误,在windows下运行时直接出错 *q = 1; #endif

Rust语言——无虚拟机、无垃圾收集器、无运行时、无空指针/野指针/内存越界/缓冲区溢出/段错误、无数据竞争

2006年,编程语言工程师Graydon Hoare利用业余时间启动了Rust语言项目.该项目充分借鉴了C/C++/Java/Python等语言的经验,试图在保持良好性能的同时,克服以往编程语言所存在的问题.其最大的特点在于保持较高的运行效率.深入的底层控制和广泛应用范围的同时,解决了传统C语言和C++语言中的内存安全问题.2009年,Mozilla接手Rust项目,创建了以Graydon为首的专业全职开发团队,并且开放了该项目的源代码.2012年1月,第一个面向公众的预览版本--v0.1 发布

关于c语言内存分配,malloc,free,和段错误,内存泄露

1.   C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数        void * malloc(size_t size) 动态配置内存,大小有size决定,返回值成功时为任意类型指针,失败时为NULL. void  free(void *ptr) 释放动态申请的内存空间,调用free()后ptr所指向的内存空间被收回,如果ptr指向未知地方或者指向的空间已被收回,则会发生不可预知的错误,如果ptr为NULL,free不会有任

C语言中常见的内存错误与解决方法

常见的错误 关于内存的一些知识已在内存分配中提及,现记录与分享常见的内存错误与对策. 类型 1:内存未分配成功,却使用了它. 方   法:在使用之前检查指针是否为NULL. 1)当指针p是函数的参数时,在函数入口处用语句assert(p!=NULL)进行断言检查. 2)当使用malloc或new来申请内存时,应该用if(p != NULL)进行防错检查. 类型 2:引用了尚未初始化的指针 原   因:内存的缺省初始值究竟是什么并没有统一的标准,在使用之前都进行初始化. 1)没有初始化的观念. 2

linux64位系统中g++4.4.7下使用wcsncpy函数有造成段错误的BUG(其他g++版本未知)

一.描述 目前已经linux64位系统中g++4.4.7下发现了该bug.其他的版本还未测试. 经测试,如果传入wcsncpy函数第一个参数(即目标缓冲区)的地址不能被4整除的话就必定会发生段错误. 经调试,函数的汇编代码中有使用到movdqa指令,该指令要求参数必须内存对齐,如果参数(目标缓存区)不是内存对齐的,就会造成段错误. 二.测试代码 #include <wchar.h> #pragma pack(1) struct Kom { char c; wchar_t s[32]; }; #

不算“真正的语言”?详说Swift 2.0中的错误处理

苹果公司在今年的全球开发者大会(Worldwide Developers Conference, WWDC)上宣布推出Swift2.0,该语言的首席架构师Chris Lattner表示,Swift 2.0主要在语言基本语法.安全性和格式美观度这三方面进行了改进.除了这些新的功能特性,还有对语法的优化.修饰及美化,最后是Swift 1.x中最具影响力的错误处理机制. 这是因为你根本无法回避它.如果打算使用Swift 2.0的话,必须接受错误处理这样的机制,并且错误处理机制将改变Cocoa和Coco

多线程中快速定位段错误位置

参考链接:https://blog.csdn.net/u011426247/article/details/79736111 在做嵌入式Linux开发的时候,程序很容易出现段错误.段错误一般是内存操作指针出错或是内存溢出等问题,有的时候系统会有一点错误提示,但有的时候就直接提示个Segmentation fault (core dumped) .如果程序是单线程,那很好处理,编译的时候添加参数-g  ,直接使用gdb 单步调试就可以直接定位到问题点在哪了.但是对于多线程,情况就不一样了.多线程进

【C语言】 strlen()入参空指针导致段错误

背景: 在工作中调试sqlite3相关代码的时候,调用printf()打印sqlite3_exec()的执行日志:因为sqlite3_exec()保存日志的参数传入时为NULL,且没有执行错误,所以再传入printf()时仍然为NULL:如果判断日志不为空时才打印,则无段错误. 分析: Core was generated by `./hello.cgi'. Program terminated with signal SIGSEGV, Segmentation fault. #0 strlen