据我了解,当程序因尝试访问不可用的内存而崩溃时,就会发生分段错误。我知道第一个程序(Ac)是错误的,因为sizeof(a)为4字节* 5 = 20字节。第二个程序(Bc)由于无限循环而出错,当我运行A.out时,我不会得到任何错误,只是结果不正确(结果也不一致)。但是当我运行B.out时,出现了分段错误。
我希望A与B有相同的分段错误,因为它们都访问了范围外的内存数据int a[5] = {1, 2, 3, 4, 5};
。有人可以告诉我为什么吗?
交流电
int main() {
int a[5] = {1, 2, 3, 4, 5};
unsigned total = 0;
printf("size of a is %lu\n", sizeof(a));
printf("total was %d\n", total);
for (int j = 0; j < sizeof(a); j++) {
total += a[j];
}
printf("sum of array is %d\n", total);
}
公元前
int main() {
int a[20];
for (int i = 0; ; i++) {
a[i] = i;
}
}
需要澄清的是:由于不断检查代码是否超出范围,因此不会出现分段错误。相反,它是一种CPU级别的机制,涉及告诉CPU RAM的哪个区域应该发生某些情况,并捕获违反此情况的情况。RAM的该区域也不完全是代码或数据的大小。因此,在某些情况下,访问日期超出范围就是正在访问CPU可能会访问的内存,例如,在您访问的变量或数组之后存储的另一个变量或数组的索引过高,甚至是一些未使用的内存,因为允许的内存块可能会具有四舍五入以匹配某些对齐边界的大小。
我认为不会int a[5] = {1, 2, 3, 4, 5};
导致您的应用程序失败。如果遗漏了,= {1, 2, 3, 4, 5}
您仍然定义了一个有效的存储块来访问,只是其内容尚未定义。
您是否期望A会因为使用sizeof(a)
而不是而失败sizeof(a)/sizeof(int)
?假设anint
为4个字节,这将导致A访问的内存是所允许的4倍。这很可能仍将保留在堆栈内存中,在此不会引起分段错误。在B中,您有一个无限循环,这导致它无法解决堆栈大小的问题,这将导致分段错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句