检索有关&& x的信息,这些信息保留&x的地址

时间:2018-10-19 07:49:14

标签: c

我想用以下代码探索指针的壮举:

#include <stdio.h>
int x = 3;
int main(void)
{
    printf("x's value is %d, x's address is %p", x, &x);
    //printf("x's address is stored in", &&x);
}

它可以正常工作并获得输出

$ ./a.out
x's value is 3, x's address is 0x10b1a6018

当我使用&x时,会为其预留一个存储空间以保留地址0x10b1a6018,因此将打印出一个地址。

随后,我打算获取有关存储另一个地址的地址的信息。

#include <stdio.h>
int x = 3;
int main(void)
{
    printf("x's value is %d, x's address is %p", x, &x);
    printf("x's address is stored in", &&x);
}

但是它报告错误为:

$ cc first_c_program.c 
first_c_program.c:14:40: warning: data argument not used by format string [-Wformat-extra-args]
    printf("x's address is stored in", &&x);
           ~~~~~~~~~~~~~~~~~~~~~~~~~~  ^
first_c_program.c:14:42: error: use of undeclared label 'x'
    printf("x's address is stored in", &&x);
                                         ^
1 warning and 1 error generated.

如何检索有关存储值x的内存地址的信息。

3 个答案:

答案 0 :(得分:5)

&x是一个临时值。它没有存储在内存中并且没有地址。

同样,&42无效,因为42没有存储在内存中(这也是一个临时值)。

您收到的有点奇怪的错误消息是因为gcc实现了一个一元&&运算符,该运算符可用于获取标签的地址。这是C语言的非标准扩展。

要获得更好的错误消息,请使用& &x(带空格)或&(&x)

但是您想要的东西根本不存在。

答案 1 :(得分:4)

let parameters: [String: AnyObject] = [ "latitude" : lat as! AnyObject, "longitude" : lng as! AnyObject, "lokasi" : (txtAlamat.text)! as! AnyObject, "keterangan" : (txtKeterangan.text)! as! AnyObject, "jenis_absen" : absenIndex as! AnyObject ] 是一个非左值表达式。它没有位置。 &x需要一个lvalue作为其操作数(或函数)。

&在标准C语言中根本不是有效的构造。地址不一定完全存储在任何地方-在您的程序中,因为&&x是全局变量,这是一个编译/链接时常量!


相反,GCC使用一元x作为扩展名来获取computed goto的跳转标签x 的地址。这本身并不会破坏C一致性,因为&&x被解析为单个令牌,并且在标准C中不允许&&作为一元运算符。

即你可以写

&&

答案 2 :(得分:1)

要执行所需的操作,您需要将&x存储在变量中:

int* y = &x;
printf("%p", &y);