我正在学习指导并浏览斯坦福PDF的例子 Stanford Pointers Guide
我决定使用他们的示例编写一些代码来更好地处理正在发生的事情。我正在从PDF的第21页开始工作。
当我运行代码时,我遇到分段错误,所以我知道我试图访问不属于我的内存,但我不明白我在哪里。我错了。
这是我写的代码:
#include <stdio.h>
#include <stdlib.h>
// function prototypes
void C();
void B();
void main(){
int *worthRef;
int num = 42;
worthRef = #
B(*worthRef);
}
// Takes value of interest by reference and adds 2
void C(int* worthRef){
*worthRef = *worthRef + 2;
printf("num = %d", &worthRef);
}
// adds 1 to value of interest then calls C()
void B(int* worthRef){
*worthRef = *worthRef + 1; // add 1 to worthRef as before
C(worthRef); // NOTE: no & required. We already have a pointer to
// the value of interest, so it can be
// passed through directly
}
答案 0 :(得分:4)
// function prototypes
void C();
void B();
这个评论是谎言。这些是函数声明没有原型(这是此代码中问题的一部分)。
B(*worthRef);
此行使用B
调用int
。 (鉴于声明int *worthRef
,*worthRef
的类型为int
。)
void B(int* worthRef){
但是这里B
期望得到一个指向int
的指针,这就是错误:你正在传递一个预期指针的数字。
要解决此问题,请将main
中的来电更改为B(worthRef)
(或B(&num)
),然后更改
printf("num = %d", &worthRef);
到
printf("num = %d\n", *worthRef);
如果你在函数声明中包含了一个原型,那么编译器会警告你这个问题(可能):
// function prototypes
void C(int *);
void B(int *);