【问题标题】:Initialize multi-level pointer to pointer and compile error occurs初始化多级指针指向指针并发生编译错误
【发布时间】:2021-06-23 11:58:13
【问题描述】:

我有这样的指针代码的多级指针:

int
main(int argc, char **argv) {
        int a = 1;
        int *pa = &a;
        //int **ppa = &pa; // [Right Code]
        int **ppa = &&a; // [Wrong Code]
        int ***pppa = &ppa;

        *ppa = pa;
        **pppa = pa;
        *pppa = &pa;
}

使用gcc编译时,这一行"int **ppa = &&a;"失败。

⋊> /h/m/stackoverfolw gcc test4.c
test4.c:在函数'main'中:
test4.c:7:2:错误:标签“a”已使用但未定义
int **ppa = &&a;
^

谁能告诉我我们是否不能初始化指向具有值类型和 2 级符号 '&' 的指针的指针?

【问题讨论】:

  • 地址没有地址。你的指针,它保存一个地址作为它的值,确实如此。如果我住在 123 Some St.,你会说我的地址是什么?
  • 为了进一步说明,假设我们做了int a = 1; int *p_int = &a; int** pp_int = &p_int; int b = 2; p_int = &b; pp_int = &p_int;pp_int 的值应该在这里改变吗?毕竟ba是不一样的,所以如果我们真的取“a的地址”,应该是不一样的。但是pp_int不是a的地址,而是p_int的地址,这个变量以前是保存a的地址,现在没有了。 p_int的地址没有变。

标签: c++ c pointers gcc compilation


【解决方案1】:

不,这在 C 和 C++ 中都是不正确的语法。退后一步,想想 address of address 是什么意思。 @sweenish 在现实生活中提供了一个很好的例子。我会求助于一些组装。

int a = 1;
int *pa = &a;

这转化为组装一些东西

    mov     DWORD PTR [rbp-12], 1
    lea     rax, [rbp-12]
    mov     QWORD PTR [rbp-8], rax

第一条mov 指令只是将值 1 分配给rbp - 12 的内存,可以猜到,它是对应于a = 1; 的程序集,这告诉a 的内存地址的值是rbp - 12 因为那是用来写入 1 的值。下一条指令lea 本质上意味着_get 内存中rbp - 12 的地址,可以猜到,实际上是rbp - 12! (即&a给出的a的地址)并将该地址存储在rax中。下一条指令只是将rax 的值移动到rbp - 8 的内存位置,这对应于设置变量pa 的值。现在,如果有一些语法来支持像int **ppa = &&a 这样的语句,那将意味着获取rbp -12 值的地址,这是没有意义的,因为获取实际值的地址没有意义。这有点类似于写类似于int *pa = &0xdeadbeef; 的东西。你有一个变量a,它是内存中的地址&a(这只是一个普通数字),然后是另一个存储该地址的变量pa

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-09
    • 2019-09-02
    • 2010-10-11
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    相关资源
    最近更新 更多