gpt4 book ai didi

C 数组段错误

转载 作者:行者123 更新时间:2023-11-30 20:00:38 26 4
gpt4 key购买 nike

有时,当您在 C 代码中访问超出范围的数组时,您不会收到运行时错误。如:

char array[1024];
char* ptr = array;
*(ptr-10) = 'a';

//or

*(ptr-4096) = 'a';

假设array在堆栈上,我很好奇让 *(ptr-SIZE) = 'a' 的 MIN SIZE 是多少在任何情况下都会抛出段错误?

例如:

*(ptr-4096*1024) = 'a' // this will always throw a segmentation fault
*(ptr-4096*8) = 'a' // sometimes this will not throw a segmentation fault

2017/1/10,新增:

很抱歉没有把问题说清楚。 :(

我想知道的不仅仅是一个模棱两可的UNDEFINED。假设栈高,堆低。所以内存布局将是:

high *********
* stack * <- my array goes here
*********
* *
* * <- ptr may be here
* *
*********
* heap *
*********
* ??? * <- ptr may be here
*********

我当然知道

The problem is that C/C++ doesn't actually do any boundary checking with regards to arrays. It depends on the OS to ensure that you are accessing valid memory

因此,上面的代码将导致操作系统内核调用 do_page_fault ,并会尝试查找vma地址,并检查是否 vma->vm_start < address

现在,让我们回到我提出的问题:让 *(ptr-SIZE) = 'a'MIN SIZE 在任何情况下都会抛出段错误。换句话说,我想知道do_page_faultSIZE能买得起。这与 C 编译器无关,而与操作系统如何保护内存有关。

最佳答案

如果您对 array[i] 进行索引(其中 i 小于 0 或大于 0),则符合 C 标准的编译器保留执行任何操作的权利1023.

这种情况下的行为被认为是未定义

试图事后猜测会发生什么是徒劳的。但如果您好奇的话,您可以随时检查生成的程序集。

关于C 数组段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41549875/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com