c语言中数组越界访问就会出现段错误吗?-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 176962
  • 博文数量: 37
  • 博客积分: 171
  • 博客等级: 入伍新兵
  • 技术积分: 315
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-13 22:54
个人简介

寻找方向程序猿、攻城狮

文章分类

(37)

  • (4)
  • (1)
  • (3)
  • (0)
  • (0)
  • (1)
  • (1)
  • (1)
  • (26)
文章存档

(1)

(4)

(1)

(1)

(1)

(2)

(19)

(2)

(1)

(5)

我的朋友
相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: c/c

2022-01-25 16:26:22


  1. #include <stdio.h>

  2. int main()
  3. {
  4.         int i;
  5.         int a[2];
  6.         a[2]=5;
  7.         printf("%d\n", i);
  8.         return 0;
  9. }

上述代码用gcc编译之后执行程序,发现会报如下错误:

  1. 5
  2. *** stack smashing detected ***: ./程序名 terminated
  3. aborted (core dumped)
查阅资料发现这是因为gcc编译时默认提供一种函数栈的保护机制stack-protector,如果函数栈出现越界访问的情况就会触发该机制。使用如下编译命令可以关掉该保护机制

点击(此处)折叠或打开

  1. gcc -o 程序名 -fno-stack-protector 程序名.c
使用该命令编译之后执行程序,发现程序可以正常执行完,并不会报告异常,但i的值已经被更改为5了。所以数组访问越界并不会触发段错误的产生。
我们对代码再做修改,如下:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         const int i;
  5.         int a[2];
  6.         //a[2]=5;
  7.         i = 6;
  8.         printf("%d\n", i);
  9.         return 0;
  10. }
编译时会报错对只读变量赋值,无法编译成功。
再把代码修改如下:

  1. #include <stdio.h>

  2. int main()
  3. {
  4.         const int i=1;
  5.         int a[2];
  6.         a[2]=5;
  7.         printf("%d\n", i);
  8.         return 0;
  9. }

会发现i的值被改为5了。
该现象说明如下3点:
1 修改const值只会在编译时检查;
2 const变量可以在运行时被意外修改;
3 数组越界并不会引发段错误。

目前仅发现给空指针赋值时会引发段错误。



阅读(1685) | 评论(0) | 转发(0) |
0

上一篇:

下一篇:

给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图