gpt4 book ai didi

c - 指针初始化为常量值 - 段错误

转载 作者:行者123 更新时间:2023-11-30 20:07:34 25 4
gpt4 key购买 nike

我有一个问题,我对得到的输出有点困惑。有人可以帮我解决这个问题吗?

`

#include <stdio.h>

int main()
{
int *i = 5;
char *c = i[1];
printf("%c", *c);
}

`

能否正确编译,没有错误。如果编译通过,运行时会出现段错误吗?如果是的话,是因为哪条线。根据我的说法,main() 的前两行是可以的。 printf 语句给出了段错误,但我无法证明它是合理的。这里 int *i 被初始化为一个常量。所以我可以将“i”指向其他位置,但不能更改*i。我将“i”的第二个字节分配给 char *c,但在这里我没有更改 *i。那么为什么打印 *c 会出现段错误。这是我的看法。寻找更好的解释。

最佳答案

通过执行int *i = 5;,您会得到一个指向无效内存地址的指针。只要您不对它进行指针算术并且不取消引用它就可以了。

通过执行 char *c = i[1];,您确实对该指针执行了指针算术(其中指向的对象不是数组),甚至取消了对它的引用。两者都意味着您正在调用未定义的行为。同时您声明初始化另一个指向无效内存地址的指针。

通过执行 printf("%c", *c);,您再次取消引用无效的指针地址,这再次调用未定义的行为。也就是说,任何事情都可能发生,包括段错误。

请注意,您仅观察到段错误,因为您运行的操作系统能够识别此类形式的恶意代码并拒绝其进一步执行。未定义的行为不保证会失败。问题是,编译器不需要通知您代码中的此类问题。

关于c - 指针初始化为常量值 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11530070/

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