C编程分段错误:11


#include <stdio.h>
int a;
int *b;
int **c;
int ***d;
int ****e;
// * is the "value of operator"
// * is also called the dereferencing // operator
int main(void) {
    a = 25;
    b = &a; // & is the "address of operator" c = &b;
    d = &c;
    e = &d;
    printf("nn%d %d %dnn",*(&a),*b+**c, ***d*****e);
    return 0;
}

当我运行它时,它说分段错误:11 我该如何修复它以及它意味着什么?

我认为,在你的代码中

  c = &b;

部分被错误地注释掉了。因此,c的值是NULL(全局范围(,并且正在取消引用并在printf()参数中使用,这反过来又可以调用未定义的行为。

分割错误是未定义行为的副作用之一。基本上,它表示某些内存访问冲突

仅供参考,C11标准文件,第 6.5.3.3 章,

一元*运算符表示间接寻址。如果操作数指向函数,则结果为 函数指示符;如果它指向一个对象,则结果是一个指示 对象。如果操作数的类型为 ‘‘pointer to type’’,则结果的类型为 ‘‘type’’ 。如果 已为指针分配无效值,一元运算符的行为* 定义。

并在同一章的脚注 102 中重新识别无效值

在一元 * 运算符取消引用指针的无效值中,有一个空指针,[......]

解决方案:取消注释该部分。

您缺少注释中的行。

c=&b;

这就是您遇到分段错误的原因。

为了更好地理解,您可以这样做。

printf("nn%d %d %dnn",*(&a),*b +**c, (***d)*(****e));
c

的值未初始化,我们尝试使用该变量对 d 的引用,因此请在 d = &c 之前添加 c = &b,这应该可以解决您的问题

你错过了

c = &b;

没有这个,你c未初始化的,你正在使用它,这会导致未定义的行为

相关内容

  • 没有找到相关文章

最新更新