【发布时间】:2022-01-02 08:21:38
【问题描述】:
我最近在网上找到了一段代码,看起来有点像这样:
#include <stdio.h>
#include <string.h>
int main() {
float m[10];
memset(m, 0, 20);
}
我还看到了一个像这样的sn-p,我认为这是正确的:
memset(m, 0, sizeof m);
当尝试使用这个 sn-p 打印出第一个示例的所有值时:
for (int i = 0; i < 20; i++) {
printf("%f, \n", m[i]);
}
它会产生这样的输出:
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
-0.000000,
-4587372491414098149376.000000,
-0.000013,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000,
0.000000
重新编译时值发生变化的地方。
现在我有几个问题:
- 为什么 memset 写入
float-array 的次数比分配的多,为什么你不能用char-array 做到这一点? - 为什么如此不一致?
- 为什么将第二个值更改为
memset到1的值不会改变输出?
【问题讨论】:
-
数组中只有 10 个浮点数。您的 sn-p 尝试打印 20。
-
@gurkensaas 记录在案的原因是访问超出其边界的数组具有未定义的行为。
-
这能回答你的问题吗? Array index out of bound behavior
-
@gurkensaas 是否有文档说明为什么这不会产生错误? 在 C 中,超出数组的边界有点像在繁忙的街道上乱穿马路。几乎任何事情都可能发生,但没有什么是可以保证的。通常,你会侥幸逃脱。有时,警察可能会给您写一张罚单(尽管这很不寻常,就像“超出数组边界”是 C 语言中的一个不寻常的错误消息一样)。偶尔会发生一些可怕的事情,比如你会被半人半撞。
-
唯一明智的举动(用WarGames 解释计算机)是根本不玩——也就是说,不要超出数组的范围!
标签: c floating-point