鱼C论坛

 找回密码
 立即注册
查看: 2205|回复: 7

[已解决]好奇問問陣列的錯誤用法問題

[复制链接]
发表于 2022-5-20 13:39:03 | 显示全部楼层 |阅读模式

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

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

x
我看說
情況一:宣告一個陣列,但未初始化,並且未對其進行設值,對這樣的陣列取值
情況二:試圖取出超過陣列長度數量的值 (比如陣列長度2,取陣列的[2]等
將會得到無法預測的值
很好奇這個值是真的無法預測嗎?
如果是這樣它的隨機性豈不是比rand()函數還高!?
最佳答案
2022-5-20 14:02:30
  1. $ cat main.c
  2. #include <stdio.h>

  3. int main(void) {
  4.     int i;
  5.     printf("%d\n", i);
  6.     return 0;
  7. }
  8. $ gcc -g -Wall -o main main.c
  9. main.c: In function ‘main’:
  10. main.c:5:5: warning: ‘i’ is used uninitialized [-Wuninitialized]
  11.     5 |     printf("%d\n", i);
  12.       |     ^~~~~~~~~~~~~~~~~
  13. main.c:4:9: note: ‘i’ was declared here
  14.     4 |     int i;
  15.       |         ^
  16. $ ./main
  17. 21979
  18. $ ./main
  19. 21969
  20. $ ./main
  21. 21946
  22. $ ./main
  23. 21881
  24. $ ./main
  25. 22085
  26. $ ./main
  27. 21937
  28. $ ./main
  29. 21998
  30. $ ./main
  31. 21968
  32. $ ./main
  33. 21900
  34. $ gcc-debug -o main main.c
  35. main.c: In function ‘main’:
  36. main.c:5:5: warning: ‘i’ is used uninitialized [-Wuninitialized]
  37.     5 |     printf("%d\n", i);
  38.       |     ^~~~~~~~~~~~~~~~~
  39. main.c:4:9: note: ‘i’ was declared here
  40.     4 |     int i;
  41.       |         ^
  42. $ ./main
  43. -983965280
  44. $ ./main
  45. -694274387
  46. $ ./main
  47. -1296513248
  48. $ ./main
  49. -1056986820
  50. $ ./main
  51. -1222945282
  52. $ ./main
  53. -559299812
  54. $ ./main
  55. 247162282
  56. $ ./main
  57. -1059543984
  58. $ ./main
  59. 2049681885
  60. $ ./main
  61. 46734574
  62. $ ./main
  63. 589615768
  64. $ ./main
  65. -1605572144
  66. $ ./main
  67. -1044684446
  68. $ ./main
  69. -1891066690
  70. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-5-20 13:53:27 From FishC Mobile | 显示全部楼层
能解释一下啥叫陣列吗
一维数组??二维数组???
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 13:59:40 | 显示全部楼层
wp231957 发表于 2022-5-20 13:53
能解释一下啥叫陣列吗
一维数组??二维数组???

喔,我們這邊叫陣列XDD
就是數組(Array)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 14:02:15 From FishC Mobile | 显示全部楼层
一隻太平洋睡鯊 发表于 2022-5-20 13:59
喔,我們這邊叫陣列XDD
就是數組(Array)

情况①,取值应该是可以取的,但是是啥玩意,未知
情况②,是程序禁区,不可以取的,即使运气好,能取到数据,也是未知
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 14:02:30 | 显示全部楼层    本楼为最佳答案   
  1. $ cat main.c
  2. #include <stdio.h>

  3. int main(void) {
  4.     int i;
  5.     printf("%d\n", i);
  6.     return 0;
  7. }
  8. $ gcc -g -Wall -o main main.c
  9. main.c: In function ‘main’:
  10. main.c:5:5: warning: ‘i’ is used uninitialized [-Wuninitialized]
  11.     5 |     printf("%d\n", i);
  12.       |     ^~~~~~~~~~~~~~~~~
  13. main.c:4:9: note: ‘i’ was declared here
  14.     4 |     int i;
  15.       |         ^
  16. $ ./main
  17. 21979
  18. $ ./main
  19. 21969
  20. $ ./main
  21. 21946
  22. $ ./main
  23. 21881
  24. $ ./main
  25. 22085
  26. $ ./main
  27. 21937
  28. $ ./main
  29. 21998
  30. $ ./main
  31. 21968
  32. $ ./main
  33. 21900
  34. $ gcc-debug -o main main.c
  35. main.c: In function ‘main’:
  36. main.c:5:5: warning: ‘i’ is used uninitialized [-Wuninitialized]
  37.     5 |     printf("%d\n", i);
  38.       |     ^~~~~~~~~~~~~~~~~
  39. main.c:4:9: note: ‘i’ was declared here
  40.     4 |     int i;
  41.       |         ^
  42. $ ./main
  43. -983965280
  44. $ ./main
  45. -694274387
  46. $ ./main
  47. -1296513248
  48. $ ./main
  49. -1056986820
  50. $ ./main
  51. -1222945282
  52. $ ./main
  53. -559299812
  54. $ ./main
  55. 247162282
  56. $ ./main
  57. -1059543984
  58. $ ./main
  59. 2049681885
  60. $ ./main
  61. 46734574
  62. $ ./main
  63. 589615768
  64. $ ./main
  65. -1605572144
  66. $ ./main
  67. -1044684446
  68. $ ./main
  69. -1891066690
  70. $
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-20 14:10:08 | 显示全部楼层

我用的編譯器每次
  1. int main(void) {
  2.     int i;
  3.     printf("%d\n", i);
  4.     return 0;
  5. }
复制代码

都會打印出0
看來這個"不可預測"可能是因為每個編譯器不一樣所以才不能確定
但如果是單一編譯器的話,估計就會是可預測的結果
我只是想說既然這樣就能達成不可預測性,那為什麼rand()還會是可預測的隨機數XD
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 14:12:50 | 显示全部楼层
不要依赖这个随机,不同的编译器,不同的编译选项
这个有可能随机,也有可能不随机

1.png
2.png

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +1 收起 理由
一隻太平洋睡鯊 + 3 + 3 + 1 確實,就是好奇想問問2333

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-20 14:34:59 | 显示全部楼层
一隻太平洋睡鯊 发表于 2022-5-20 14:10
我用的編譯器每次

都會打印出0

rand是用数学算法实现的一个伪随机函数
这个不可预测 可以理解成是 你无法预测它是不是随机,如何随机,随机程度有多高
就像这个程序,输出没有初始化的局部变量,每一次都输出0一样
程序中需要一个随机数,你总不能弄一个没有初始化的局部变量吧?你就能确定这个没有初始化的局部变量一定是随机的?

参考
  1. /dev/random
复制代码

http://www.what21.com/u/10007/9089274064966658452.htm

理论上来说,我们存在的这个世界是不存在随机的,量子的运动也是有规律的
我们完全可以逆向出任意一个随机数,当然我们人类目前的算力还无法做到这一点

那么,你说这个随机数是真正的随机数,还是伪随机数?
理论上可以逆向出这个随机数来,但是我们人类目前的算力无法做到这一点

你如何定义这个随机数?

“你无法预测它是不是随机”
其实这么说并不准确,应该说成是
你现在无法预测它是不是随机
未来可就不一定了

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
一隻太平洋睡鯊 + 5 + 5 + 3 感覺就像不存在真正的自由意志一樣/w\

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 09:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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