Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何在printf中查看结构的地址_C_Pointers_Struct - Fatal编程技术网

C 如何在printf中查看结构的地址

C 如何在printf中查看结构的地址,c,pointers,struct,C,Pointers,Struct,我有一个返回地址的函数,如下所示 struct node *create_node(int data) { struct node *temp; temp = (struct node *)malloc(sizeof(struct node)); temp->data=data; temp->next=NULL; printf("create node temp->data=%d\n",temp-&

我有一个返回地址的函数,如下所示

struct node *create_node(int data)
{
        struct node *temp;
        temp = (struct node *)malloc(sizeof(struct node));
        temp->data=data;
        temp->next=NULL;
        printf("create node temp->data=%d\n",temp->data);
        return temp;
}
结构节点在哪里

struct node {
        int data;
        struct node *next;
};
如何在printf(“”)中看到存储在temp中的地址

更新
如果我检查gdb中的地址,地址将采用十六进制数字格式,即。
0x602010,其中,
printf(“%p”,temp)”中的同一地址的编号与我在gdb print命令中看到的不同。

使用指针地址格式说明符
%p

printf("Address: %p\n", (void *)temp);
编辑: 不要这样做!它打印指针的地址,而不是您想要的

我在让它工作时遇到了各种各样的麻烦,但编译器(我使用简单的“cc”unix命令行)并没有抱怨,似乎给出了适当的结果:

struct node temp;
// ... whatever ...
printf ("the address is %p", &temp);
[我没有删除,而是将此作为不应执行的操作的示例。-smb]

在此处输入代码
enter code here

#include<stdio.h>
struct anywhere
{ 
double a;
int b;
char c;
float d;
}g;
int main()
{
printf("%p\n%p\n%p\n%p\n",&g.a,&g.b,&g.c,&g.d);
return 0
}        
#包括 构造任意位置 { 双a; int b; 字符c; 浮动d; }g; int main() { printf(“%p\n%p\n%p\n%p\n”、&g.a、&g.b、&g.c、&g.d); 返回0 }
现在我们可以得到输出: g.a.的地址,反之亦然

我们可以这样打印结构变量地址 通过打印每个成员的地址,我们可以看到填充在结构中是如何发生的

谢谢大家
如有任何错误和建议,请发表评论

+1:对于过于热心(学究式的正确)的编译器,将指针投射到
void*
printf(“%p”,(void*)temp)
为什么不直接打印东西的地址,比如
printf(“0x%08X”,&temp)
?@aroth:您不能保证
无符号
结构节点**
具有相同的表示形式:您的代码段在64位计算机上严重失败instance@pmg我想你的第一个注释重新转换为<>代码>空> >代码>只适用于C++吗?在C语言中,您可以将任何指针类型传递给一个函数,该函数需要一个
void*
,no?@Paul:
printf
是一个接受可变数量参数的函数。第一次之后的参数“无原型”。编译器无法强制执行正确类型的值,程序员必须手动执行。我不知道C++。这是错误的(参见另一个讨论的答案),同样,这个问题清楚地要求看<代码> TEMP而不是<代码>和TEMP @ M.M,是的,进一步的测试表明你是对的。这个答案打印指针的地址,而不是其中的值。