C指针分割错误混淆

时间:2016-08-20 18:12:36

标签: c segmentation-fault

我正在学习指导并浏览斯坦福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 = &num;
    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
}

1 个答案:

答案 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 *);