V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
ReputationZh
V2EX  ›  C

在外网看到一个比较好玩的问题,一下没反应过来。

  •  
  •   ReputationZh · Nov 1, 2021 · 4634 views
    This topic created in 1644 days ago, the information mentioned may be changed or developed.
    #include <stdio.h>
    
    int a = 12345;
    
    void test(int *temp)
    {
        temp = &a;
    }
    
    int main(int argc, char const *argv[])
    {
    
        int *b = NULL;
    
        test(b);
    
        printf("%d\n",  a);
        printf("%d\n", *b);
    
        return 0;
    }
    

    return

    12345    
    Segmentation fault    
    

    为什么段错误呢?

    14 replies    2022-04-26 16:34:57 +08:00
    AoEiuV020
        1
    AoEiuV020  
       Nov 1, 2021
    这不是老生常谈的传值传引用的问题么,c 语言入门书应该都有强调这些问题吧,
    fkdog
        2
    fkdog  
       Nov 1, 2021
    test()里 temp 只是一个形参,
    ReputationZh
        3
    ReputationZh  
    OP
       Nov 1, 2021
    @fkdog 这个解释可以
    Hallelu
        4
    Hallelu  
       Nov 1, 2021
    temp = &a; 并没有改变 b 的指向
    ch2
        5
    ch2  
       Nov 1, 2021
    test(b);//这一行不起任何作用
    ryd994
        6
    ryd994  
       Nov 1, 2021 via Android
    把书看懂 || gdb 里跑一趟
    这两样你做了任一样就不会有这个问题
    gdb 里跑一圈就明白的事
    CreSim
        7
    CreSim  
       Nov 1, 2021 via Android
    显然你需要传指针的指针。
    ligiggy
        8
    ligiggy  
       Nov 1, 2021
    temp 是形参。因为传递的是 null ,要想赋值,可以传递 指针的指针,然后 new 一个对象同时赋值即可

    传入 int **temp ,然后赋值为*temp = new int(a);
    0Vincent0Zhang0
        9
    0Vincent0Zhang0  
       Nov 1, 2021 via Android
    int a = 12345 //申请一个存放 int 的盒子
    int *b = NULL //申请了一个存放 int 盒子位置的 b 盒子,盒子里面放着 0 这个值
    test(b) //把 b 盒子的内容 0 传给 test
    // 进入 test 后 temp = b 盒子的内容,就是 0
    temp = &a //把 a 盒子的位置传给 temp
    printf("%d\n", a); //打印 a 盒子的内容
    printf("%d\n", *b); //打印 b 盒子内容 0 所指向的盒子里面的内容,因为访问不到 0 位置的盒子内容,所以报错了。

    在这里,test 无法改变 b 盒子的内容,因为传给 test 的只是 b 盒子的内容,而要改变 b 盒子的内容则需要传 b 盒子的位置。

    例如这样改:
    void test(int **temp){ *temp = &a }
    test(&b);
    Jooooooooo
        10
    Jooooooooo  
       Nov 1, 2021
    temp 变了啊
    Brian1900
        11
    Brian1900  
       Nov 1, 2021
    想要修改一级指针的值,需要将函数参数修改为二级指针,否则函数将拷贝一份新的一级指针,修改的是新指针的值而不是 b 的值
    anzu
        12
    anzu  
       Nov 2, 2021
    把指针全去了,就不影响理解了,b 还是 b 。所以很多语言表面上都隐藏了指针的概念。
    GrayXu
        13
    GrayXu  
       Nov 2, 2021
    《大一 C 语言课程》
    Kasumi20
        14
    Kasumi20  
       Apr 26, 2022
    访问内存 0x0000000000000000 ,能不段错误吗?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1195 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 17:10 · PVG 01:10 · LAX 10:10 · JFK 13:10
    ♥ Do have faith in what you're doing.