gpt4 book ai didi

c - 期待 SIGSEGV ,但正在正常工作

转载 作者:行者123 更新时间:2023-12-02 00:05:39 26 4
gpt4 key购买 nike

我正在研究一个 C 输出问题:

#include<stdio.h>
int main()
{
int a[][2][3]={0,1,2,3,4,5,6,7,8,9,10,11,12};
int i=-1;
int d;
d=a[i++][++i][++i];
printf("%d\n",d);
return 0;
}

Ideone 链接:http://ideone.com/1oS9Un

并预计会出现运行时错误,但令人惊讶的是代码在 CodeBlocks、Dev C++ 和 Ideone 上运行良好。

根据我的说法,编译器在运行时通过以下等式解析每个内存地址:a[i][j][k]= ((*(a+i)+j)+ k), 因此每个编译器都应该首先解析内括号,然后是下一个内括号,依此类推。

因此给定的行

d=a[i++][++i][++i];

应该解析为:

d=*(*(*(a+i++)+ ++i)+ ++i)

还有 , http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm (请引用注2)

最里面的括号应该首先解析,它的值应该是 a-1,i 变成 0。因此我们应该得到一个 SIGSEGV 错误,因为我们试图访问编译器没有特别标记的内存,仍然输出是显示在所有三个编译器中。请解释一下。

最佳答案

Thus we should get a SIGSEGV error

不,我们不应该。如果行为是 undefined ,任何事情都有可能发生。不能保证会出现段错误。

附言您的代码的行为未定义,但出于问题中所述以外的原因。实际原因是您在序列点之间多次修改了 i。查看C FAQ .

关于c - 期待 SIGSEGV ,但正在正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18507229/

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