#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));
的值未初始化,我们尝试使用该变量对 d 的引用,因此请在 d = &c 之前添加 c = &b,这应该可以解决您的问题
你错过了
c = &b;
没有这个,你c
未初始化的,你正在使用它,这会导致未定义的行为