鱼C论坛

 找回密码
 立即注册
查看: 1433|回复: 8

[已解决]请教数组的问题

[复制链接]
发表于 2022-1-22 15:33:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
int main ()
{
        int a [6] = {1, 2, 3, 4, 5,6};
        int i;
       
        for (i=0; i<5; ++i)
                printf("%d\n",a[i]);
               
        printf("%d\n",a[6]);   
       
       
        return 0;
}

输出的结果是1 2 3 4 5 5

a[6]超出数组定义,应该是无效值,为什么加了for语句,输出的结果是5,请教大家,谢谢
最佳答案
2022-1-22 15:43:47
既然数组越界访问是未定义行为,那么不能输出几?不能输出 5 ?为什么?
既然都未定义行为了还有不能这么一说?

  1. $ cat main.c
  2. #include <stdio.h>
  3. int main ()
  4. {
  5.         int a [6] = {1, 2, 3, 4, 5,6};
  6.         int i;

  7.         for (i=0; i<5; ++i)
  8.                 printf("%d\n",a[i]);

  9.         printf("%d\n",a[6]);


  10.         return 0;
  11. }
  12. $ gcc -g -Wall -o main main.c
  13. $ ./main
  14. 1
  15. 2
  16. 3
  17. 4
  18. 5
  19. 680017920
  20. $ ./main
  21. 1
  22. 2
  23. 3
  24. 4
  25. 5
  26. 412153344
  27. $ ./main
  28. 1
  29. 2
  30. 3
  31. 4
  32. 5
  33. -37150208
  34. $ ./main
  35. 1
  36. 2
  37. 3
  38. 4
  39. 5
  40. 1624091904
  41. $ ./main
  42. 1
  43. 2
  44. 3
  45. 4
  46. 5
  47. 1042244352
  48. $ ./main
  49. 1
  50. 2
  51. 3
  52. 4
  53. 5
  54. 1974735360
  55. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-1-22 15:36:05 | 显示全部楼层
输出的这个 5 就是有效值?
无效值的定义是什么?什么叫做无效值?
这个5就可以理解成 “无效值”
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-22 15:37:49 | 显示全部楼层
那你说吧,不输出5,输出几合适?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-22 15:43:47 | 显示全部楼层    本楼为最佳答案   
既然数组越界访问是未定义行为,那么不能输出几?不能输出 5 ?为什么?
既然都未定义行为了还有不能这么一说?

  1. $ cat main.c
  2. #include <stdio.h>
  3. int main ()
  4. {
  5.         int a [6] = {1, 2, 3, 4, 5,6};
  6.         int i;

  7.         for (i=0; i<5; ++i)
  8.                 printf("%d\n",a[i]);

  9.         printf("%d\n",a[6]);


  10.         return 0;
  11. }
  12. $ gcc -g -Wall -o main main.c
  13. $ ./main
  14. 1
  15. 2
  16. 3
  17. 4
  18. 5
  19. 680017920
  20. $ ./main
  21. 1
  22. 2
  23. 3
  24. 4
  25. 5
  26. 412153344
  27. $ ./main
  28. 1
  29. 2
  30. 3
  31. 4
  32. 5
  33. -37150208
  34. $ ./main
  35. 1
  36. 2
  37. 3
  38. 4
  39. 5
  40. 1624091904
  41. $ ./main
  42. 1
  43. 2
  44. 3
  45. 4
  46. 5
  47. 1042244352
  48. $ ./main
  49. 1
  50. 2
  51. 3
  52. 4
  53. 5
  54. 1974735360
  55. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-22 15:47:44 | 显示全部楼层
未定义行为是什么?
未定义行为就是让编译器作者自由发挥,想怎么整就怎么整
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-22 15:52:43 | 显示全部楼层
对于未定义行为,不管得到的结果有多么离谱,都是非常正常的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-22 17:01:38 | 显示全部楼层
明白了。想怎么整就怎么整
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-1-22 17:10:51 | 显示全部楼层
哈哈哈,这个其实也没啥用
我猜是因为 你文件比较小,申请内存的时候地址是 挨着的
a[6]存的应该是i 的值
你在int i下面 int j =99;
a[7]的值输出应该是99
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-1-23 08:10:22 | 显示全部楼层
翼是孤独 发表于 2022-1-22 17:10
哈哈哈,这个其实也没啥用
我猜是因为 你文件比较小,申请内存的时候地址是 挨着的
a[6]存的应该是i 的值 ...

有问题再请教
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 01:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表